【问题标题】:Understand meaning of statement in code - activityCallback = (ToolbarListener) context理解代码中语句的含义 - activityCallback = (ToolbarListener) context
【发布时间】:2019-01-02 08:34:37
【问题描述】:

我正在尝试理解这一行的含义:

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 变量中。

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

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

我已附上整个项目的 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);

    }
}

【问题讨论】:

    标签: android-studio interface fragment


    【解决方案1】:

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

    由于 Activity 实现了 ToolbarListener,因此 ToolbarListener 将成为已实现 Activity 对象的父级。因此,您可以对它进行类型转换。

    【讨论】:

    • @RaviAgrawal 实际上在对象类型转换的情况下,我们需要类型转换到其他类的类必须通过继承相关。据我了解,比较属性并非如此。
    • 感谢您抽出宝贵时间回答。这确实消除了混乱。祝您有美好的一天,先生。
    • @RaviAgrawal 很高兴为您提供帮助。
    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多