我可以控制 TabLayout/ViewPager 应用中何时允许滑动吗?

Can I control when a swipe is allowed in a TabLayout/ViewPager app?

我正在为我的第二个应用程序做一些原型设计,它将使用 TabLayout 和 ViewPager 以特定顺序显示一系列 4 个页面,以便用户可以按逻辑方式执行任务。我将需要确保在完成早期页面上的工作之前,用户不会从早期页面跳转到后期页面。在 TabLayout/ViewPager 应用程序中甚至可能吗?

到目前为止,我看到的所有示例都演示了三个选项卡,并显示用户可以毫不费力地从一个选项卡滑动到下一个选项卡,然后再滑动回来。 None 的示例甚至暗示可以 阻止 滑动(或跳动)到其他页面之一,直到满足给定条件。我需要了解是否有可能在这样的应用程序中限制 swiping/tabbing。

我希望用户完成第一页上的 "work",然后通过单击“下一步”按钮表示 he/she 已完成。除非按下 NEXT,否则用户不应该能够继续到另一页。 (NEXT 按钮本质上是用户告诉应用程序他已完成第一页的方式。)出于同样的原因,如果用户在后面的页面之一,我不希望他能够返回到 most 页中的前一页:我想编写程序逻辑,根据目前发生的情况决定是否可以将他带回前一页。

我可以做我在 Android Studio 3.1.4 中提议的事情吗?如果是,我将用来控制滑动和 Tab 键的主要 classes/methods 是什么?

如果这在 Android 中不可能,我应该使用什么方法来构建我的应用程序?

使用 Lockable View Pager 禁用通过用户输入触摸在 viewpager 中滑动

public class LockableViewPager extends ViewPager {

private boolean swipeLocked;

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

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

public boolean getSwipeLocked() {
    return swipeLocked;
}

public void setSwipeLocked(boolean swipeLocked) {
    this.swipeLocked = swipeLocked;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return !swipeLocked && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return !swipeLocked && super.onInterceptTouchEvent(event);
}

@Override
public boolean canScrollHorizontally(int direction) {
    return !swipeLocked && super.canScrollHorizontally(direction);
}

}

在 Tablayout 中设置 viewpager 后,尝试使用以下 tablayout 代码禁用触摸时的标签切换

LinearLayout tabStrip = ((LinearLayout)mTabLayout.getChildAt(0));
for(int i = 0; i < tabStrip.getChildCount(); i++) {
    tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
}

参考选项卡触摸选择禁用。