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,并且每次视图改变它重新加载当前片段

https://developer.android.com/reference/android/support/v4/view/ViewPager.html#getOffscreenPageLimit();

为了给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) { } });