了解代码中语句的含义-activityCallback =(ToolbarListener)上下文

时间:2019-01-02 08:34:37

标签: android-studio interface fragment

我正试图了解这一行的含义:

activityCallback =(ToolbarListener)上下文

在表达式下-


public class ToolbarFragment extends Fragment implements SeekBar.OnSeekBarChangeListener {


    private static int seekValue = 10;
    private static EditText editText;

    ToolbarListener activityCallback;

    public interface ToolbarListener {

        public void onButtonClick (int position, String text);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {activityCallback = (ToolbarListener) context;}
            catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement ToolBarListener");
            }

    }

我了解将使用上述表达式创建对上下文的引用(此处为“父活动”)并将其存储在activitycallback变量中。

但是,我无法理解如何将接口对象强制转换为活动(此处为上下文)。

我能够完全理解其他代码,并且我的项目正在运行。这是一个项目,其中父活动使用侦听器接口与两个片段进行通信。

我已附加了整个项目的Java文件,以防您可能需要查看代码。

关于, 拉维。

----ToolbarFragment.java-----
package com.ebookfrenzy.fragmentexample;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;

public class ToolbarFragment extends Fragment implements SeekBar.OnSeekBarChangeListener {


    private static int seekValue = 10;
    private static EditText editText;

    ToolbarListener activityCallback;

    public interface ToolbarListener {

        public void onButtonClick (int position, String text);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {activityCallback = (ToolbarListener) context;}
            catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement ToolBarListener");
            }

    }

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        // inflate the layout for this fragment

        View view = inflater.inflate(R.layout.toolbar_fragment, container,false);

        editText = (EditText) view.findViewById(R.id.editText1);
        final SeekBar seekBar = view.findViewById(R.id.seekBar1);
        seekBar.setOnSeekBarChangeListener(this);
        final Button button = view.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonClicked(v);
            }
        });



        return view;
    }

    private void buttonClicked(View v) {
        activityCallback.onButtonClick(seekValue, editText.getText().toString());
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        seekValue = progress;
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
}

-----TextFragment.java----

package com.ebookfrenzy.fragmentexample;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;



public class TextFragment extends Fragment {

    private static TextView textView;

    @Override
    public View onCreateView(
            LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {
        // inflate the layout for this fragment

        View view = inflater.inflate(R.layout.text_fragment, container, false);
        textView = (TextView)view.findViewById(R.id.textView1);
        return view;

    }

    public void changeTextProperties (int fontSize, String text) {
        textView.setTextSize(fontSize);
        textView.setText(text);

    }
}

----FragmentActivity.java----

package com.ebookfrenzy.fragmentexample;

import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class FragmentExampleActivity extends FragmentActivity
            implements ToolbarFragment.ToolbarListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_example);
    }

    @Override
    public void onButtonClick(int fontSize, String text) {
        TextFragment textFragment = (TextFragment)
                getSupportFragmentManager().findFragmentById(R.id.text_fragment);
        textFragment.changeTextProperties(fontSize, text);

    }
}

1 个答案:

答案 0 :(得分:0)

在不同情况下,可能有几种不同的活动可以承载此片段。因此,我们制定了一条规则:承载此片段的任何活动都必须实现ToolbarListener。该接口定义了片段和承载该片段的活动之间的“契约”。在onAttach()中,我们验证上下文是否为ToolbarListener,然后继续将演员表保存到ToolbarListener以便以后使用。

由于活动实现了ToolbarListener,因此ToolbarListener将成为实现的Activity对象的Parent。因此,您可以进行类型转换。