如何使用view pager处理后退按钮?

Pre*_*thi 9 android android-viewpager back-stack

我有两个片段Frag A和Frag B,它们使用view pager呈现.如果用户从A滑动到B然后按下后退按钮(在B中),则用户应该转到A而不是离开视图寻呼机.我们怎样才能做到这一点?

向Backstack添加事务似乎没有帮助.

谢谢

Dee*_*eeV 20

你必须覆盖中的onKeyDown()方法Activity.

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将捕获"后退"按钮按下事件并将用户发送到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

只有当用户在下一页时才会将用户发送回上一页.否则,它将正常注册"后退",用户将按预期退出.

您可能需要用户返回上一页的情况(假设您有两页以上).在这种情况下,您希望实现ViewPager.OnPageChangeListener()并在每次onPageSelected(int position)调用时保存位置.如果您在堆栈中实现它们,那么每次用户按下"后退"时都可以将它们弹出.堆栈为空后,退出应用程序.

编辑

正如Jade Byfield的评论中正确陈述的那样,稍微简单一点的方法就是onBackPressed()在Activity中使用.这仅适用于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.
  }
}
Run Code Online (Sandbox Code Playgroud)