use*_*701 48 android onresume onpause android-viewpager
将ViewPager与片段一起使用时,在选项卡之间移动时不会调用onPause(),onResume()方法.当我们被显示或被隐藏时,我们是否有任何方法可以在片段中找到答案?
不幸的是我在onResume(),onPause()中有逻辑,比如注册位置服务,在切换标签时永远不会停止,因为onPause()永远不会被调用,直到退出整个应用程序.
谢谢
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();
然后在onResume()中:
    if (getUserVisibleHint())
        /* resume code */
并在onPause()中:
    if (!getUserVisibleHint())
        /* pause code */
这是getActiveFragment代码,避免搜索它:
    return fragmentManager.findFragmentByTag("android:switcher:" + viewPagerId + ":" + position);
注意:片段有一个isVisible()方法,但它似乎不是很一致,因此使用UserVisibleHint.
编辑:用私有标志替换UserVisibleHint.工作得更好!
小智 7
如果您使用的是Android支持库(rev 11),则可以使用getUserVisibleHint或覆盖setUserVisibleHint()捕获可见的更改并隐藏。看这个帖子。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // do something when visible.
    }
}
当前版本的ViewPager库允许启用所需的开箱即用行为,只需FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT作为第二个参数传递给FragmentPagerAdapter。
还可以考虑使用ViewPager2来取代ViewPager. ViewPager2调用onPause()并按onResume()默认情况预期,无需配置。
请参阅此答案以了解更多详细信息。
| 归档时间: | 
 | 
| 查看次数: | 31802 次 | 
| 最近记录: |