先说说父Activity
Fragment的生命周期大家都清楚,我就不一一赘述了,今天我们主要来说一下onAttach(),我们都知道onAttach()有两种重写方法,其中一种就是
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
当执行该方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作,这时你即可得到该Activity,初始化控件,便可更改其内容(项目需求,我用的是Textview),也可直接使用fatherActivity调用其内部方法
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof FatherActivity) {
FatherActivity fatherActivity= (FatherActivity) activity;
textView= (TextView)fatherActivity.findViewById(R.id.textView);
}
}
很简单呢。。。。
然后再说说获取父类Fragment的方法,,,,,
刚开始时走进了误区,犯了经验错误,一直想用getParentFragment这个去得到父类的控件,但是一直报空指针异常,跳进源码看了下还是不得其解,源码解释是如果父类是一个Fragment则返回这个Fragment如果是一个Activity则返回null,但是这个父类确实Fragment啊,难道是说的是顶层的Activity?但是如果是顶层的Activity这个方法又有什么意义呢,于是百度了一番,也没找到具体的错误信息,但是功能还得做啊。。。
/**
* Returns the parent Fragment containing this Fragment. If this Fragment
* is attached directly to an Activity, returns null.
*/
final public Fragment getParentFragment() {
return mParentFragment;
}
一时没想到好的方法,于是很傻逼的在父Fragment重新掉了一次接口,,,,然后改变控件的显示内容。。。。是不是很傻逼,,,
直到今天不经意看代码是,想到了getActivity这个方法,,,,,于是开始干
TextView textview= (TextView) getActivity().findViewById(R.id.textview);
txt_title.setText("你想修改的信息");
然后成功了。。。成功了。。。功了。。。了
调用父Fragment方法我的思路和在Activity中类似,类似这样
if(fragment instanceof FatherFragment){
((FatherFragment) fragment ).youMethod();
}
但是怎么样得到Fragment呢?这是个问题,于是想到了getFragmentManager()这个方法里有个getFragments()方法,可以得到一个Fragment列表,我们只要循环下,然后就可以得到父Fragment的实例了
Listlist=(List)ChildFragment.this.getFragmentManager().getFragments();
for(Fragment fragment: list){
if(fragment instanceof FatherFragment){
((FatherFragment) fragment ).youMethod();
break;
}
}
运行代码,这样就可以了,不要问我为什么不用
(FatherFragment)(ChildFragment.this.getParentFragment())).youMethod();
因为我报空指针,,,还没找到原因。。。。。