Exception:must implement OnFragmentInteractionListener

来源:互联网 发布:手机域名 编辑:程序博客网 时间:2024/06/14 23:21

转载请注明出处:http://blog.csdn.net/parallelyk/article/details/51510569

今天写代码的时候发现,用Android Studio创建一个blank Fragment的时候会为我们创建一个Fragment的模板。

public class MainFragment extends Fragment {    // TODO: Rename parameter arguments, choose names that match    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER    private static final String ARG_PARAM1 = "param1";    private static final String ARG_PARAM2 = "param2";    // TODO: Rename and change types of parameters    private String mParam1;    private String mParam2;    private OnFragmentInteractionListener mListener;    public MainFragment() {        // Required empty public constructor    }    /**     * Use this factory method to create a new instance of     * this fragment using the provided parameters.     *     * @param param1 Parameter 1.     * @param param2 Parameter 2.     * @return A new instance of fragment MainFragment.     */    // TODO: Rename and change types and number of parameters    public static MainFragment newInstance(String param1, String param2) {        MainFragment fragment = new MainFragment();        Bundle args = new Bundle();        args.putString(ARG_PARAM1, param1);        args.putString(ARG_PARAM2, param2);        fragment.setArguments(args);        return fragment;    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (getArguments() != null) {            mParam1 = getArguments().getString(ARG_PARAM1);            mParam2 = getArguments().getString(ARG_PARAM2);        }    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        return inflater.inflate(R.layout.fragment_main, container, false);    }    // TODO: Rename method, update argument and hook method into UI event    public void onButtonPressed(Uri uri) {        if (mListener != null) {            mListener.onFragmentInteraction(uri);        }    }    @Override    public void onAttach(Context context) {        super.onAttach(context);        if (context instanceof OnFragmentInteractionListener) {            mListener = (OnFragmentInteractionListener) context;        } else {            throw new RuntimeException(context.toString()                    + " must implement OnFragmentInteractionListener");        }    }    @Override    public void onDetach() {        super.onDetach();        mListener = null;    }    /**     * This interface must be implemented by activities that contain this     * fragment to allow an interaction in this fragment to be communicated     * to the activity and potentially other fragments contained in that     * activity.     * <p/>     * See the Android Training lesson <a href=     * "http://developer.android.com/training/basics/fragments/communicating.html"     * >Communicating with Other Fragments</a> for more information.     */    public interface OnFragmentInteractionListener {        // TODO: Update argument type and name        void onFragmentInteraction(Uri uri);    }}

其中有一段:

if (context instanceof OnFragmentInteractionListener) {            mListener = (OnFragmentInteractionListener) context;        } else {            throw new RuntimeException(context.toString()                    + " must implement OnFragmentInteractionListener");        }

即我们的context也就是Activity必须实现OnFragmentInteractionListener。

那么OnFragmentInteractionListener是什么东西?

在一个Activity中往往有多个Fragment,他们之间是无法直接通信的,所以Fragment需要通过它们所绑定的Activity作为中介来进行通信。而OnFragmentInteractionListener就是用来实现不同Fragment之间通信的接口。OnFragmentInteractionListener在OnAttach阶段注册并复制给mListener。

使用:在Fragment中直接调用mListener.OnFragmentInteractionListener(uri)

mListener.OnFragmentInteractionListener(uri)

在Activity中通过

    @Override    public void onFragmentInteraction(Uri uri) {           //做想要做的数据操作和通信,如给其他Fragment发送数据           sendMsgTo(otherFragment,uri);    }



0 0