代码之家  ›  专栏  ›  技术社区  ›  Hamza Belmellouki

为什么我要将上下文作为接口的实例进行降级?

  •  1
  • Hamza Belmellouki  · 技术社区  · 6 年前

    我刚开始在Android上学习fragment API。 我只想给我的包含活动发一条消息(我做了)。现在我想澄清一个关于下压的误解。

    这是我的片段:

    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;
    
    public class DetailFragment extends Fragment {
    
    private EditText textFirstName, textLastName, textAge;
    private FragmentListener mListener;
    
    public DetailFragment() {
    }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    
        if (!(context instanceof FragmentListener)) throw new AssertionError();
        mListener = (FragmentListener) context;
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
    
        textFirstName = (EditText) rootView.findViewById(R.id.textFirstName);
        textLastName = (EditText) rootView.findViewById(R.id.textLastName);
        textAge = (EditText) rootView.findViewById(R.id.textAge);
    
        Button doneButton = (Button) rootView.findViewById(R.id.done_button);
        doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                done();
            }
        });
        return rootView;
    }
    
    private void done() {
        if (mListener == null) {
            throw new AssertionError();
        }
    
        String firstName = textFirstName.getText().toString();
        String lastName = textLastName.getText().toString();
        int age = Integer.valueOf(textAge.getText().toString());
    
        mListener.onFragmentFinish(firstName, lastName, age);
    }
    
    public interface FragmentListener {
        void onFragmentFinish(String firstName, String lastName, int age);
    }
    
    }
    

    我不理解这里的贬低:

    mListener = (FragmentListener) context;
    

    上下文类如何与我的FragmentListener接口相关?

    我发现这与我对向下投射(向下投射是投射到子类型,向下投射到继承树)的了解是矛盾的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ted Hopp    6 年前

    这两种类型, Context FragmentListener 是无关的。然而,一个子类 上下文 可能实现 碎片侦听器 接口。您的 onAttach() 方法检查这实际上是发生了什么,而向下投射是否 碎片侦听器 功能可通过 mListener 成员字段。

    任何 上下文 (很可能是 Activity )附加的实例 DetailFragment 需要实施 DetailFragment.FragmentListener 为了避免 AssertionError 在运行时。