Fragment可见性总结:
1, onHiddenChanged(boolean hidden)
(1)只在调用hideFragment/showFragment后才会调用,PagerAdapter方式中不会调用。
(2)对应的isHidden()方法,只对show/hide方式有用。
(3)show/hide触发时只针对当前fragment有用,对其子fragment没有作用,即子fragment不会回调onHiddenChanged方法。
2, setUserVisibleHint(booleanisVisibleToUser)
(1)只在PagerAdapter方式中回调调用。
(2) Fragment的PagerAdapter包括FragmentStatePagerAdapter和FragmentPagerAdapter两个子抽象类。
3, Fragment的isVisible()判断方法
(1)在PagerAdapter方式中不准确,即fragment不是PagerAdapter当前显示的fragment时也会是true。
总结:
要正真判断fragment是否处于可见显示状态,要综合考虑fragment的添加方式和其生命周期来处理
(1) 生命周期可见状态变化时作出相应变化,如onResume,onPause中。
(2) 同时针对onHiddenChanged和setUserVisibleHint两种情况来监听可见性变化。
(3) 嵌套的fragment,子fragment不会随父fragment可见性变化而主动变化。
修改的可以真正判断可见性的BaseFragment:
public class BaseFragment extends Fragment {
private boolean isCanShowing = true;
@Override
public void onResume() {
super.onResume();
isCanShowing = isVisible();
}
@Override
public void onHiddenChanged(boolean hidden) {
isCanShowing = !hidden;
onVisibleChanged(isVisibleOnScreen());
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanShowing = isVisibleToUser;
onVisibleChanged(isVisibleOnScreen());
}
protected void onVisibleChanged(boolean isVisible) {
}
@Override
public void onStop() {
super.onStop();
isCanShowing = false;
}
// 判断可见性,对手动显示与PagerAdapter方式均有效,且跟随父fragment可见性状态
public boolean isVisibleOnScreen() {
if (isCanShowing && getUserVisibleHint() && isVisible()) {
if (getParentFragment() == null) {
return true;
}
if (getParentFragment() instanceof BaseFragment) {
return ((BaseFragment) getParentFragment()).isVisibleOnScreen();
} else {
return getParentFragment().isVisible();
}
}
return false;
}
}
本文详细介绍了Android中Fragment的可见性管理方法,包括onHiddenChanged和setUserVisibleHint的使用场景及注意事项,并提供了一个BaseFragment类作为参考实现。

511

被折叠的 条评论
为什么被折叠?



