Android FragmentPagerAdapter在切换fragment时,怎么有些乱.

新手上路,请多包涵

我用FragmentPagerAdapter 进行fragment切换,一共是5个fragment。

一开始的时候,是把前3个create了,我切换显示第2个的时候,程序把第4个第5个fragment进行了create;

切换显示第5个的时候,第2个fragment进行了onPause、onDestroyView等操作;第5个本身的onStart却没有被调用;

再切换显示第2个,第5个进行了onDestroyView等操作;第1个又进行了createView的操作;第2个自身的onStart也没有被调用;

=============================================================

我本来想在onStart和onPause里面,加一个变量,用于判断当前的fragment是不是正在显示,从而进行一些操作 ;这样一看,根本无法实现。

阅读 2.7k
2 个回答

我试了一下我的方案,能帮你判断是否显示/隐藏
image.png
在fragment中:

    @Override
    public void onResume() {
        super.onResume();
        DebugLogUtil.getInstance().Debug("OrderCentreFrag 显示 ");
    }

    @Override
    public void onPause() {
        super.onPause();
        DebugLogUtil.getInstance().Debug("OrderCentreFrag 隐藏 ");
    }

只想看查看解决方法的话,可以直接跳到参考资料[1]文末。

参考资料:
① Fragment新功能,setMaxLifecycle了解一下
② in androidx.fragment.app.Fragment,setUserVisibleHint()is Deprecated,and not executed,why?


Fragment老版本,可以用setUserVisibleHint(boolean isVisibleToUser)来观察它是否前台可见(即用户可见),但是这个函数有个问题,就是它超出生命周期管理。

新版本已经废弃该函数了,并提供新的解决方案:FragmentTransaction.setMaxLifecycle(Fragment, Lifecycle.State)

Deprecated
If you are manually calling this method, use FragmentTransaction.setMaxLifecycle(Fragment, Lifecycle.State) instead.

参考资料:Fragment新功能,setMaxLifecycle了解一下

文末也提到了FragmentPagerAdapter懒加载的方法:使用BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT并结合Fragment生命周期函数onResume()实现懒加载。示例代码:

new FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

另外,虽然setUserVisibleHint(boolean)被废弃,但是还有类似的方法:
How to know when fragment actually visible in viewpager

不推荐setUserVisibleHint(boolean)类的方法,因为这类函数超出生命周期管理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏