如何使用视图寻呼机来处理返回button?

我有使用视图寻呼机呈现的两个碎片碎片A和碎片B. 如果用户已经从A刷到B然后按下返回button(当在B)时,那么用户应该去A而不是从视图寻呼机出来。 我们怎样才能做到这一点?

将交易添加到堆栈似乎没有帮助。

谢谢

Solutions Collecting From Web of "如何使用视图寻呼机来处理返回button?"

您必须重写ActivityonKeyDown()方法。

 @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); } } 

这将捕获“返回”button按下事件,并将用户发送到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); } } 

只有当用户在下一页时才会将用户返回到上一页。 否则,将正常注册“后退”,用户将按预期退出。

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

编辑

正如在Jade Byfield的评论中正确地指出的那样,稍微简单的方法是在Activity中使用onBackPressed() 。 这只适用于5 +以上的API。

 @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. } } 

我认为一个更好的方法是将后端密钥处理委派给相应的片段。 我已经使用了一个CustomFragment,它支持一个方法来处理返回键。 所有碎片将从这个CustomFragment延伸。

 public abstract class BackKeyHandlingFragment extends Fragment { public abstract boolean handleBackKey(); } 

Activity可以将backKey处理委托给当前的Fragment。 碎片可以在各自实现的handleBackKey方法中执行所需的操作。 该方法可以返回true来告诉活动不处理返回键。 要在“活动”级别执行默认的后退键操作,该方法可以返回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(); } }