【发布时间】:2012-11-01 21:06:39
【问题描述】:
我有两个片段 Frag A 和 Frag B 使用 view pager 呈现。 如果用户从 A 滑到 B 然后按下返回按钮(在 B 中时),那么用户应该去 A 而不是离开 view pager 。我们怎样才能做到这一点?
将事务添加到 backstack 似乎没有帮助。
谢谢
【问题讨论】:
标签: android android-viewpager back-stack
我有两个片段 Frag A 和 Frag B 使用 view pager 呈现。 如果用户从 A 滑到 B 然后按下返回按钮(在 B 中时),那么用户应该去 A 而不是离开 view pager 。我们怎样才能做到这一点?
将事务添加到 backstack 似乎没有帮助。
谢谢
【问题讨论】:
标签: android android-viewpager back-stack
您必须覆盖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);
}
}
仅当用户在下一页时才会将用户送回上一页。否则,它将正常注册“返回”,用户将按预期退出。
您可能希望用户返回上一页的情况(假设您有两个以上的页面)。在这种情况下,您希望实现ViewPager.OnPageChangeListener() 并在每次调用onPageSelected(int position) 时保存位置。如果您在堆栈中实现它们,那么您可以在每次用户按下“返回”时弹出它们。一旦堆栈为空,退出应用程序。
编辑
正如 Jade Byfield 在 cmets 中正确指出的那样,更简单的方法是在 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.
}
}
【讨论】:
onKeyDown() 中返回 true,那么这将是唯一发生的事情,事件将停止级联。
super.onBackPressed()。
在 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);
}
}
这会选择上一页或退出当前活动。
【讨论】:
我认为更好的方法是将后键处理委托给相应的片段。我使用了一个支持处理后退键的方法的 CustomFragment。所有的 Fragment 都将从这个 CustomFragment 扩展。
public abstract class BackKeyHandlingFragment extends Fragment {
public abstract boolean handleBackKey();
}
Activity 可以将 backKey 处理委托给当前的 Fragment。片段可以在它们各自的 handleBackKey 方法实现中执行所需的操作。该方法可以返回 true 来告诉活动不要处理返回键。要在 Activity 级别继续使用默认的返回键操作,该方法可以返回 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();
}
}
【讨论】: