ViewPager与片段 – onPause(),onResume()?
当使用带片段的ViewPager时,我们的onPause(),onResume()方法在选项卡之间移动时不会被调用。 当我们可见或隐藏时,有什么方法可以在片段中找出?
不幸的是,我在onResume(),onPause()方面有逻辑,就像注册位置服务一样,切换标签时永远不会停止,因为onPause()永远不会被调用,直到退出整个应用程序。
谢谢
ViewPager带有OnPageChangeListener
接口。 通过为以前和当前显示的页面设置一些标志,可以模拟这种行为。
考虑到以前的解决scheme不是很清楚,下面是我如何解决它感谢Phix他的提示:
在OnPageChange()callback中:
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代码,避免search:
return fragmentManager.findFragmentByTag("android:switcher:" + viewPagerId + ":" + position);
注意:片段有一个isVisible()方法,但它看起来不是很一致,因此使用了UserVisibleHint。
编辑:用私有标志replaceUserVisibleHint。 工作得更好!
你可以用ViewPager的OnPageChangeLsitener实现你的逻辑。 下面是一个关于如何实现viewpager的onpagechangelistener的例子:
yourPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int i) { // When on page selected if position is not spesific for you // you can find your fragment or you can switch position. } @Override public void onPageScrollStateChanged(int i) { } });
你可以在Fragment中使用下面的方法:
public void setUserVisibleHint(boolean isVisibleToUser){}
当isVisibleToUser == true时,显示片段
有点晚,但在我的当前应用程序中,我已经为我的viewpager设置OffScreenPageLimit为1,这意味着片段不会被caching,并且每次视图改变它重新加载当前片段
为了给savepopulation的答案中的方法多一点定义:
yourPager.setOnPageChangeListener(new GridViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int row, int column, float rowOffset, float columnOffset, int rowOffsetPixels, int columnOffsetPixels) { } @Override public void onPageSelected(int row, int column) { // When on page selected if position is not specific for you // you can find your fragment or you can switch position. } @Override public void onPageScrollStateChanged(int state) { } });