【问题标题】:How to handle back button using view pager?如何使用视图寻呼机处理后退按钮?
【发布时间】:2012-11-01 21:06:39
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: android android-viewpager back-stack


    【解决方案1】:

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

    【讨论】:

    • 他也能覆盖 onBackPressed 吗?还是仅适用于早期的 API?
    • 使用 onKeyDown() 适用于每个平台 API 级别 1+。此外,除非我一直使用错误,否则 onBackPressed 不会阻止 Activity 从堆栈中弹出。如果您在 onKeyDown() 中返回 true,那么这将是唯一发生的事情,事件将停止级联。
    • 等等。刚刚脑残了。是的。如果他想针对 API 5+,他可以使用 onBackPressed()。除非您完全确定要退出,否则不要拨打super.onBackPressed()
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我认为更好的方法是将后键处理委托给相应的片段。我使用了一个支持处理后退键的方法的 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多