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

时间:2015-03-12 00:29:21

标签: android android-fragments android-viewpager android-tabs

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

您肯定想要创建自己的自定义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;
    }
}

您希望在课程setLastPageEnabled()setLastPageIndex()中使用两种主要方法。您可以将最后一页索引设置为您需要的任何内容,如果您有三个项目,则将其设置为2.然后还使用setLastPageEnabled(false)禁用滑动或重新启用使用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" />

最后在适当位置的片段或活动中引用它:

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