美文网首页小技巧
判断当前fragment是否对用户可见

判断当前fragment是否对用户可见

作者: 飞奔的小马 | 来源:发表于2017-04-24 11:05 被阅读676次
前言

最近在重构项目时,导航滑动使用activity嵌套fragment,在fragment中需要判断此fragment是否对用户可见,特此在这记录下解决方案。

几种情况

(1)ViewPager中嵌套几个fragment
由于ViewPager的预加载效应,当从页面1切换到页面2的时候,虽然页面3对于用户看不见,其实已经把页面3加载出来了,会调用页面3的onResume()方法,我们可以通过setUserVisibleHint()方法来判断当前fragment是否可见

   @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        try{
            if(getUserVisibleHint()){//界面可见时
                initReqUnreadNotice();
                getCacheSize();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

注意此方法只会在不同fragment切换时才会调用,如果从fragment跳转到activity是不会调用此方法的,是不会调用setUserVisibleHint方法的,这时就要根据onResume和onPause方法来判断界面是否显示
(2)使用Activity直接引入 或者通过FragmentManager的addFragment或replaceFragment动态载入,只要监听Fragment的onResume和onPause方法就能够判断其显隐。

 @Override
    public void onResume() {
        super.onResume();
        updateUserState();
    }
@Override
    public void onPause() {
        super.onPause();
       //...
    }

(3)通过FragmentManager的showFragment和hideFragment加载fragment时,显示与隐藏fragment,隐藏fragment时并没有调用onPause()方法,这时需要根据onHiddenChanged方法来判断

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if(hidden){
        //...显示的操作
    } else {
        //...隐藏的操作
    }
}

如果用户直接按home键退出了,我们的程序也没有对按home键事件进行监听,在按home键时调用hideFragment,那么onHiddenChanged事实上没有被调用,反而是onPause被调用了。所以我们需要针对这样的情况做特殊的处理。比如在home键退出时显示调用一下hideFragment或者在onPause中也发信号说本Fragment不可见了,这都是可以的。

参考文档:http://www.sixwolf.net/blog/2016/01/14/how-to-judge-if-fragment-is-visible-to-user/

相关文章

网友评论

    本文标题:判断当前fragment是否对用户可见

    本文链接:https://www.haomeiwen.com/subject/oywuzttx.html