fragment是我们经常使用到的一个控件,但是,相信大家会出现这样的一个问题,每次切换fragment的时候之前我们一直都是这样写的代码:
/**
* 根据传入的参数来改变当前的fragment
*
* @param fragment
*/
private void showFragment(Fragment fragment) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.layout_content, fragment);
transaction.commit();
}
但是这样的写法在需要网络数据时会很消耗用户的数据流量和机器性能,所以我们就正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。(这也是谷歌官方推荐的做法)
/**
* 修改显示的内容 不会重新加载
* to 下一个fragment
* mContent 当前的fragment
*/
private void switchContent(Fragment to) {
if (mContent != to) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (!to.isAdded()) {
transaction.hide(mContent).add(R.id.layout_content, to).commit();
} else {
transaction.hide(mContent).show(to).commit();
}
mContent = to;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
你会发现使用hide和show这时fragment的生命周期不再执行,不走任何的生命周期,这样在有的情况下,数据将无法通过生命周期方法进行刷新,所以你可以使用onHiddenChanged方法来解决这问题。
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
return;
}else{
}
}
接手别人代码今天碰到这问题了,说是切换了数据没有刷新,执行了下生命周期,改成这样这样你就可以单独处理你需要的fragment的数据和ui的刷新了。