通常情况下,我们都是通过如下代码进行交互的
View listView = getActivity().findViewById(R.id.list);
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现它。
当activity通过这个接口接收到一个回调,它可以同布局中的其他fragment分享这个信息。
一个应用在一个MainActivity中有两个fragment,一个MenuFragment显示两个按钮,一个MainFragment显示内容(就一TextView)。
当一个按钮被选择的时候,MenuFragment必须通知MainActivity,然后MainActivity通知MainFragment,让它显示内容。
这个情况下,在MenuFragment中声明一个接口MyMenuListener(第一步)
为了确保宿主activity实现这个接口,MenuFragment的onAttach()方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的activity强制类型转换,实例化一个MyMenuListener对象:(第二步)
之后MainActivity实现这个MyMenuListener接口,在复写的函数里面修改MainFragment里面的内容。(第三步)
MenuFragment.java
public class MenuFragment extends Fragment {
private MyMenuListener myMenuListener;
private Button news, music;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.menu, container, false);
news = (Button)view.findViewById(R.id.News);
news.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myMenuListener.changeValue("music");
}
});
music = (Button)view.findViewById(R.id.Music);
music.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myMenuListener.changeValue("news");
}
});
return view;
}
//回调接口,第一步
public static interface MyMenuListener{
public void changeValue(String value);
}
@Override //第二步
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
myMenuListener = (MyMenuListener)activity;
}
MainActivity.java
public class MainActivity extends Activity implements MenuFragment.MyMenuListener{
// private MenuFragment menuFragment;
private MainFragment mainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.interact);
// menuFragment = (MenuFragment) getFragmentManager().
// findFragmentById(R.id.MenuFragment);
mainFragment = (MainFragment) getFragmentManager().
findFragmentById(R.id.MainFragment);
}
@Override //第三步
public void changeValue(String value) {
// TODO Auto-generated method stub
mainFragment.changeTextViewText(value);
}
}
MainFragment.java
public class MainFragment extends Fragment {
private TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.main_fragment, container, false);
tv = (TextView) view.findViewById(R.id.text);
return view;
}
public void changeTextViewText(String value){
tv.setText(value);
}
}