google上说replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。
正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个,这样就能做到多个Fragment切换不重新实例化。
- 启动一个fragment,无论是add或者replace,生命周期都是正常的oncreat--onstart-onresume-onpause-ondestory
- 如果启动的fragment加入了回退栈,那么如果返回到这个fragment的时候,其实是不调用任何的生命周期方法。这时候我们只能用广播或者rxbus或者eventbus来判定来到了哪个页面。
- 如果启动的fragment没有加入回退栈,用add方式。 那么用隐藏hide的方式来展示当前的fragment的话,同样也是不调用任何的生命周期方法。这时候我们只能用广播或者rxbus或者eventbus来判定来到了哪个页面。
- fragment的传值,可以使用bundle或者rxbux或eventbus或者使用sharepreference或者使用内存(实体)。
- fragment的onActivityResult()方法要想有效的途径,可以在mainactivity的onActivityResult中递归所有的fragment,将数据抛送。
Activity中的:
@Override
protected voidonActivityResult(intrequestCode, intresultCode,Intent data) {
super.onActivityResult(requestCode,resultCode,data);
FragmentManager fragmentManager = getSupportFragmentManager();
for(intindext = 0;indext < fragmentManager.getFragments().size();indext++) {
Fragment fragment = fragmentManager.getFragments().get(indext);//找到第一层Fragment
if(fragment ==null)
Logger.w("MainActivity","Activity result no fragment exists");
else
handleResult(fragment,requestCode,resultCode,data);
}
}
/**
* 递归调用,对所有的子Fragment生效
*
*@paramfragment
*@paramrequestCode
*@paramresultCode
*@paramdata
*/
private voidhandleResult(Fragment fragment, intrequestCode, intresultCode,Intent data) {
fragment.onActivityResult(requestCode,resultCode,data);//调用每个Fragment的onActivityResult
List<Fragment> childFragment = fragment.getChildFragmentManager().getFragments();//找到第二层Fragment
if(childFragment !=null)
for(Fragment f : childFragment)
if(f != null) {
handleResult(f,requestCode,resultCode,data);
}
if(childFragment ==null) {
Logger.d("MainActivity","no childFragment");
}
}
Fragment中:
重写onActivityResult()方法即可。
另外Fragnmet有 onHiddenChanged(boolean hidd) {} 重写的判定,可以判定当前的fragnmetn是否为隐藏。但是并不太好用。之后再写demo统一尝试。
以上只是自己在测试机上log日志所得。 可能有所错误。 望指正。