10

我有两个片段 Frag A 和 Frag B 使用 view pager 呈现。如果用户从 A 滑到 B 然后按下返回按钮(在 B 中时),那么用户应该去 A 而不是离开 view pager 。我们怎样才能做到这一点?

将事务添加到 backstack 似乎没有帮助。

谢谢

4

3 回答 3

21

您必须覆盖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);
    }
}

这将捕获“返回”按钮按下事件并将用户发送到 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 在评论中正确指出的那样,一个稍微简单的方法是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.
  }
}
于 2012-11-01T21:14:04.707 回答
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);
  }
}

这会选择上一页或退出当前活动。

于 2018-01-17T19:38:30.053 回答
0

我认为更好的方法是将后键处理委托给相应的片段。我使用了一个支持处理后退键的方法的 CustomFragment。所有片段都将从这个 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();
    }
}
于 2016-07-26T11:18:46.070 回答