临时/动态禁用 Viewpager 中的单个页面

Bio*_*eJD 4 android android-fragments android-viewpager android-tabs

我有一个扩展的 FragmentPagerAdapter,它为 ViewPager 提供 3 个片段,给我 3 个页面,我可以在它们之间滑动或使用我添加到操作栏的选项卡来手动选择页面。

我想暂时禁止用户使用任一导航类型访问最终页面(禁用任何特定页面的更通用的解决方案也很有趣,但不是必需的)。然后,我将通过其中一个片段的回调重新启用他们的访问。

我已经阅读了一些关于不允许通过覆盖 onTouchEvent 和 onInterceptTouchEvent 进行滑动的类似问题的答案,然后在其中使用一些自定义手势检测,甚至是使用 beginFakeDrag() 的一半解决方案。

我当前的解决方案只是在适配器中设置较小的项目数,确保使用 notifyDataSetChanged(),并在必要时将其更改回来。这些方法是否有任何优雅的替代方案,也许不需要更改数据集?

我还看到 ActionBar.Tab 没有 setEnable() 方法,并且大多数建议只删除选项卡。有没有办法让标签保持可见但不可选?我的方法是定义哪个选项卡被禁用,如果用户选择了禁用的选项卡,则重新选择之前选择的选项卡。

编辑:我的目标是禁用标签和滑动到最后一页。

Dav*_*ker 5

您肯定会想要创建自己的自定义 ViewPager 子类。我创建了一个简单的自定义ViewPager调用CustomSwipePager,它将在需要时处理阻塞的用户交互。

public class CustomSwipeViewPager extends ViewPager {

    private boolean mLastPageEnabled = false;
    private int mLastPageIndex = 0;

    public NoSwipeViewPager(Context context) {
        super(context);
    }

    public NoSwipeViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLastPageEnabled(boolean enabled) {
        mLastPageEnabled = enabled;
    }

    public void setLastPageIndex(int index) {
        mLastPageIndex = index;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event){

        if(!mLastPageEnabled && getCurrentItem() >= (mLastPageIndex - 1)) {
            // Always return false to disable user swipes
            return false;
        }

        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (!mLastPageEnabled && getCurrentItem() >= (mLastPageIndex - 1)) {
            // Always return false to disable user swipes
            return false;
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在类setLastPageEnabled()setLastPageIndex(). 您可以将最后一页索引设置为您需要的任何内容,在您的情况下,如果您有三个项目,您可以将其设置为 2。然后也用于setLastPageEnabled(false)禁用滑动或重新启用 use setLastPageEnabled(true)

您可以将此自定义视图包含到您的布局中,如下所示:

<com.mypackage.CustomSwipeViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_swipe_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

最后在您的 Fragment 或 Activity 中的适当位置引用它:

private CustomSwipeViewPager mPager;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    mPager = (CustomSwipeViewPager) findViewById(R.id.custom_swipe_view_pager);
    mPager.setLastPageEnabled(false);
    mPager.setLastPageIndex(2);
}
Run Code Online (Sandbox Code Playgroud)

  • 这类似于我在我的问题中引用的解决方案,您可以在其中覆盖 onTouchEvent 和 onTouchInterceptEvent。非常干净的实现。此解决方案缺少的部分是检测手势的方向,以仍然允许从倒数第二页滑回前一页。如果我决定走这条路,我将包括我的代码。 (2认同)