Activity与Fragment的通信方式
- Fragment访问Activity的内容
- Activity访问Fragment的内容
- Fragment与Activity共享事件
Fragment访问Activity的内容
Fragment通过getActivity()这种方式获取Activity实例后,可以访问Activity中定义的public成员。
Activity访问Fragment的内容
- 通过FragmentManager的FindFragmentById(int fragmentId)方法,这种情形适用于
Activity获取其布局文件中的Fragment情况 - Activity中创建Fragment时,通过Fragment的setArgument(Bundle bundle)方法向Fragment传递参数,然后在Fragment的onCreate()生命周期函数中的调用getArgument()
方法获取参数
Fragment与Activity共享事件,实现方式(接口回调)
Fragment定义接口,然后Fragment所属的Activity实现该接口,Fragment在持有一个
实现接口的Activity实例进行事件的共享。
在Fragment中定义一个接口,如:
class TestFragment extends Fragment { private OnAnswerSelectedListener listener; public interface OnAnswerSelectedListener{ void onAnswerSelected(String url); } }
在TestFragment所属的Activity中实现TestFragment中定义的这个接口
OnAnswerSelectedListener,如:class TestActivity extends Activity implements TestFragment.OnAnswerSelectedListener { public void onAnswerSelected(String url) { } }
在TestFragment中接受已经实现OnAnswerSelectedListener接口的Activity,如:
class TestFragment extends Fragment { private OnAnswerSelectedListener listener; public interface OnAnswerSelectedListener{ void onAnswerSelected(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { // 强转要防止异常 listener = (OnAnswerSelectedListener)activity; } catch(ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnAnswerSelectedListener"); } }
}
接下来TestFragment就可以和TestActivity共享事件了,如:
class TestFragment extends Fragment implements ListView.OnListItemClickListener { private OnAnswerSelectedListener listener; public interface OnAnswerSelectedListener{ void onAnswerSelected(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { // 强转要防止异常 listener = (OnAnswerSelectedListener)activity; } catch(ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnAnswerSelectedListener"); } } @Override public void onListItemClick(ListView l,View v,int position,long id){ // 生成参数 Uri noteUri =ContentUris.withAppendedId(ArticleColumns .CONTENT_URI,id); // 将事件和参数传递给所属的Activity listener.onArticleSelected(noteUri); // TestActivity 中处理该事件 } }