如何使用ViewPager处理返回按钮?

10
我有两个片段Frag A和Frag B,它们是使用视图翻页器呈现的。如果用户从A滑到B,然后在B中按返回按钮,则用户应该跳转到A而不是跳出视图翻页器。我们该如何实现这一点?将事务添加到返回堆栈似乎并没有帮助。谢谢。
3个回答

21

您必须在Activity中覆盖onKeyDown()方法。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

这将捕获“返回”按钮按下事件并将用户发送到ViewPager中的第一项。
还有ViewPager#getCurrentItem(),它可以用于仅在用户滑动时返回。可以使用以下实现:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

如果用户在下一页,则只会将用户发送回上一页。否则,它将正常注册“back”,并且用户将按预期退出。
如果您有多个页面并且希望用户返回到上一页,则需要实现ViewPager.OnPageChangeListener()并在每次调用onPageSelected(int position)时保存位置。如果您在堆栈中实现它们,那么每次用户按“back”键时都可以弹出它们。一旦堆栈为空,就退出应用程序。
编辑
如Jade Byfield在评论中所述,一个稍微更容易的方法是在Activity中使用onBackPressed()。这仅适用于API级别5+。
@Override
public void onBackPressed() {
  if(i_dont_want_to_leave) {
     myViewPager.setCurrentItem(0, true);
  } else {
    super.onBackPressed(); // This will pop the Activity from the stack.
  }
}

他能否重写 onBackPressed 方法?还是只适用于早期的 API? - Jade Byfield
使用onKeyDown()可以在每个平台API级别1+上工作。另外,除非我一直使用它有误,否则onBackPressed无法防止Activity从堆栈中弹出。如果你在onKeyDown()中返回true,那么这将是唯一发生的事情,事件将停止级联。 - DeeV
等一下。我突然想到了一个点子。是的,如果他想针对API 5+,他可以使用onBackPressed()。只要你确定你想退出,就不要调用super.onBackPressed() - DeeV

4
在 Android 文档页面上

https://developer.android.com/training/animation/screen-slide.html#viewpager

我找到了一个处理ViewPager滑动的示例,并且有一个方法。
@Override
public void onBackPressed() {
  if (mPager.getCurrentItem() == 0) {
    super.onBackPressed();
  }
  else {
    mPager.setCurrentItem(mPager.getCurrentItem() - 1);
  }
}

这个选项可以返回上一页或退出当前活动。


0
我认为一个更好的方法是将返回键处理委托给各个片段。我使用了一个支持处理返回键的CustomFragment。所有的片段都将继承自这个CustomFragment。
public abstract class BackKeyHandlingFragment extends Fragment {
    public abstract boolean handleBackKey();
}

Activity可以将backKey处理委托给当前的Fragment。Fragment可以在其各自实现的handleBackKey方法中执行所需的操作。该方法可以返回true,告诉Activity不要处理back key。要继续使用Activity级别的默认back key操作,该方法可以返回false。

public void onBackPressed() {
     BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem());
     // Fragment should return boolean according to app requirements after processing back key
     if (!fragment.handleBackKey()) { 
        super.onBackPressed();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接