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();
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.工作得更好!
小智 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)
当前版本的ViewPager
库允许启用所需的开箱即用行为,只需FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
作为第二个参数传递给FragmentPagerAdapter。
还可以考虑使用ViewPager2来取代ViewPager
. ViewPager2
调用onPause()
并按onResume()
默认情况预期,无需配置。
请参阅此答案以了解更多详细信息。
归档时间: |
|
查看次数: |
31802 次 |
最近记录: |