带有片段的ViewPager - onPause(),onResume()?

use*_*701 48 android onresume onpause android-viewpager

将ViewPager与片段一起使用时,在选项卡之间移动时不会调用onPause(),onResume()方法.当我们被显示或被隐藏时,我们是否有任何方法可以在片段中找到答案?

不幸的是我在onResume(),onPause()中有逻辑,比如注册位置服务,在切换标签时永远不会停止,因为onPause()永远不会被调用,直到退出整个应用程序.

谢谢

Phi*_*hix 17

ViewPager附带了OnPageChangeListener界面.通过为先前和当前显示的页面设置一些标志,您可以模拟此行为.


3c7*_*c71 10

考虑到以前的解决方案不是很清楚,这里是我解决它的方式,感谢Phix的提示:

在OnPageChange()回调中:

    Fragment old_fragment = getActiveFragment(old_position);
    Fragment new_fragment = getActiveFragment(new_position);
    old_f.setUserVisibleHint(false);
    old_f.onPause();
    new_f.setUserVisibleHint(true);
    new_f.onResume();
Run Code Online (Sandbox Code Playgroud)

然后在onResume()中:

    if (getUserVisibleHint())
        /* resume code */
Run Code Online (Sandbox Code Playgroud)

并在onPause()中:

    if (!getUserVisibleHint())
        /* pause code */
Run Code Online (Sandbox Code Playgroud)

这是getActiveFragment代码,避免搜索它:

    return fragmentManager.findFragmentByTag("android:switcher:" + viewPagerId + ":" + position);
Run Code Online (Sandbox Code Playgroud)

注意:片段有一个isVisible()方法,但它似乎不是很一致,因此使用UserVisibleHint.

编辑:用私有标志替换UserVisibleHint.工作得更好!

  • 直接调用生命周期方法绝不是一个好的解决方案 (17认同)
  • 这不是操作系统错误.这意味着`Fragment`仍在内存中.`ViewPager`将在内存中保留至少2个`Fragments`来实现其分页性质.请看这个[答案](http://stackoverflow.com/a/11650582/2029566)了解更多详情. (4认同)
  • 正确的解决方案是在OnPageChangeListener中执行逻辑.onPause和onResume用于活动进出背景而不是用于可见性更改. (2认同)

小智 7

如果您使用的是Android支持库(rev 11),则可以使用getUserVisibleHint或覆盖setUserVisibleHint()捕获可见的更改并隐藏。看这个帖子

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // do something when visible.
    }
}
Run Code Online (Sandbox Code Playgroud)


Val*_*kov 6

当前版本的ViewPager库允许启用所需的开箱即用行为,只需FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT作为第二个参数传递给FragmentPagerAdapter

还可以考虑使用ViewPager2来取代ViewPager. ViewPager2调用onPause()并按onResume()默认情况预期,无需配置。

请参阅此答案以了解更多详细信息。