前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ViewPager+ Fragment结合的setUserVisibleHint()调用时机

ViewPager+ Fragment结合的setUserVisibleHint()调用时机

作者头像
Android技术干货分享
发布2019-06-11 10:32:51
1.6K0
发布2019-06-11 10:32:51
举报
文章被收录于专栏:Android技术分享

最近的项目使用到了ViewPager + Fragment的模式,要求在每次Fragment获取显示的时候来刷新数据,该项目下ViewPager有5个子fragment,在onCreateView及fragment的setUserVisibleHint(bool isVisibleToUser)中的isVisibleToUser为true的时候刷新数据的时候出现数据多次刷新的情况,因此对ViewPage + Fragment的生命周期做了研究。

项目布局最顶层5个button,主体是ViewPager+fragment, 可以通过点击button直接跳转到对应的fragment,也可以通过左右滑动来进行相邻跳转。

为了研究多个fragment的生命周期,加入打印如下:

代码语言:javascript
复制
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Slog.i("onCreateView 3");
        View view = inflater.inflate(R.layout.my_police_events_fragment, container, false);
        return view;
    }
 
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        Slog.i("setUserVisibleHint 3 " + isVisibleToUser);
        super.setUserVisibleHint(isVisibleToUser);
    }
 
    @Override
    public void onDestroyView() {
        Slog.i("onDestroyView 3 ");
        super.onDestroyView();
    }
1. 第一次进入该activity,fragment1被选中,打印如下:
代码语言:javascript
复制
第一次进入
setUserVisibleHint 1 false
setUserVisibleHint 2 false
setUserVisibleHint 1 true
onCreateView 1
onCreateView 2

参数为true

2. 从fragment1切换到fragment2,fragment2被选中,打印如下:
代码语言:javascript
复制
从1--->2
setUserVisibleHint 3 false
setUserVisibleHint 1 false
setUserVisibleHint 2 true
onCreateView 3

创建了fragment3,且fragment2中的setUserVisibleHint参数为true

3.从fragment2切换到fragment3,fragment3被选中,打印如下:
代码语言:javascript
复制
从2--->3
setUserVisibleHint 4 false
setUserVisibleHint 2 false
setUserVisibleHint 3 true
onDestroyView 1 
onCreateView 4

创建了fragment4,销毁了fragment1,且fragment3中的setUserVisibleHint参数为true

4. 后面滑动的过程日志打印如下:
代码语言:javascript
复制
从3--->2
setUserVisibleHint 1 false
setUserVisibleHint 3 false
setUserVisibleHint 2 true
onCreateView 1
onDestroyView 4
 
从2--->3
setUserVisibleHint 4 false
setUserVisibleHint 2 false
setUserVisibleHint 3 true
onDestroyView 1 
onCreateView 4
 
从3--->4
setUserVisibleHint 5 false
setUserVisibleHint 3 false
setUserVisibleHint 4 true
onDestroyView 2
onCreateView 5
 
从4--->5
setUserVisibleHint 4 false
setUserVisibleHint 5 true
onDestroyView 3 

猜测:通过以上日志,可以发现,不论fragment如何变化,首先被选中的fragment会调用参数为true的setUserVisibleHint方法,被选中的fragment与相邻的fragment的状态肯定是onCreate的状态(如果未create就调用onCreateView,如果已经是onCreate的状态不调用),相邻的fragment会调用参数为false的setUserVisibleHint方法,其他的fragment是处于onDestroy的状态。

5. 为了验证我们的猜想,将不再采用相邻滑动的方式,采用button点击跳转的方式来检验fragment的生命周期。相关打印如下:
代码语言:javascript
复制
从5--->2
setUserVisibleHint 2 false
setUserVisibleHint 1 false
setUserVisibleHint 3 false
setUserVisibleHint 5 false
setUserVisibleHint 2 true
onCreateView 2
onCreateView 1
onCreateView 3
onDestroyView 4 
onDestroyView 5 
 
从2--->4
setUserVisibleHint 4 false
setUserVisibleHint 5 false
setUserVisibleHint 2 false
setUserVisibleHint 4 true
onCreateView 4
onCreateView 5
onDestroyView 2 
onDestroyView 1 

总结:

可以看到,不管fragment如何变化,都是按照上面的规则进行变动的,知道了fragment的生命周期,那么就可以选择在合适的时期对我们的数据进行处理了,避免出现数据未加载或者多次加载的情况了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 第一次进入该activity,fragment1被选中,打印如下:
  • 2. 从fragment1切换到fragment2,fragment2被选中,打印如下:
  • 3.从fragment2切换到fragment3,fragment3被选中,打印如下:
  • 4. 后面滑动的过程日志打印如下:
  • 5. 为了验证我们的猜想,将不再采用相邻滑动的方式,采用button点击跳转的方式来检验fragment的生命周期。相关打印如下:
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档