有没有可能在ViewPager上禁用滚动?

155

我有一个ViewPager,它实例化了一个View。 我想在搜索结果返回到视图时短暂地禁用viewpager和子按钮的滚动。 我已经调用了viewPager.setEnabled(false) ,但这并没有禁用它们。

有人有任何想法吗?


16个回答

2
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;

public class NonSwipeableViewPager extends ViewPager {

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

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

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // stop swipe 
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // stop switching pages
    return false;
}

private void setMyScroller() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        scroller.set(this, new MyScroller(getContext()));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public class MyScroller extends Scroller {
    public MyScroller(Context context) {
        super(context, new DecelerateInterpolator());
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int 
duration) {
        super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
    }
}
}

在您的Layout.XML文件中,将任何 --- com.android.support.V4.ViewPager --- 标签替换为 --- com.yourpackage.NonSwipeableViewPager --- 标签。

Kotlin中的相同解决方案:

class NonSwipeableViewPager constructor(
    context: Context,
    attrs: AttributeSet?
) : ViewPager(context, attrs) {

    private var isPagingEnabled = true

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return isPagingEnabled && super.onTouchEvent(event)
    }

    override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(event)
    }

    fun setPagingEnabled(isEnabled: Boolean) {
        isPagingEnabled = isEnabled
    }
}

2
我基于将此Java答案转换而来创建了Kotlin版本:https://dev59.com/TWkw5IYBdhLWcg3wyNgV#13437997 ViewPager没有内置的方法可以禁用页面之间的滑动,需要扩展ViewPager并重写onTouchEvent和onInterceptTouchEvent以阻止滑动操作。为了使其更加通用化,我们可以添加一个名为setSwipePagingEnabled的方法来启用/禁用页面之间的滑动。
class SwipeLockableViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) {
    private var swipeEnabled = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return when (swipeEnabled) {
            true -> super.onTouchEvent(event)
            false -> false
        }
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return when (swipeEnabled) {
            true -> super.onInterceptTouchEvent(event)
            false -> false
        }
    }

    fun setSwipePagingEnabled(swipeEnabled: Boolean) {
        this.swipeEnabled = swipeEnabled
    }
}

然后在我们的布局xml中,我们使用新的SwipeLockableViewPager代替标准ViewPager。
<mypackage.SwipeLockableViewPager 
        android:id="@+id/myViewPager" 
        android:layout_height="match_parent" 
        android:layout_width="match_parent" />

现在,在我们的活动/片段中,我们可以调用myViewPager.setSwipePagingEnabled(false),用户将无法在页面之间滑动。

更新

截至2020年,我们现在拥有ViewPager2。如果您迁移到 ViewPager2,那么有一个内置方法可以禁用滑动:myViewPager2.isUserInputEnabled = false


1

新的ViewPager2类来自androidx,可以使用setUserInputEnabled(false)方法禁用滚动。

private val pager: ViewPager2 by bindView(R.id.pager)

override fun onCreate(savedInstanceState: Bundle?) {
    pager.isUserInputEnabled = false
}

0

这对我有效:-(对于ViewPager2)

viewPager.isUserInputEnabled = false

0

slayton的答案很好。如果你想停止像猴子一样滑动,你可以重写OnPageChangeListener。

@Override public void onPageScrollStateChanged(final int state) { 
        switch (state) { 
            case ViewPager.SCROLL_STATE_SETTLING: 
                mPager.setPagingEnabled(false); 
                break; 
            case ViewPager.SCROLL_STATE_IDLE: 
                mPager.setPagingEnabled(true); 
                break; 
        } 
    }

所以你只能左右滑动


1
我没有找到任何关于ViewPager的方法,例如setPagingEnabled(boolean value)。 - Rakesh Yadav
你需要创建 setPagingEnabled(boolean value) 方法,因为没有可以覆盖的方法。 - Kharak
不清楚 setPagingEnabled() 方法的作用。请包含完整的代码。 - Alex Semeniuk

0
在viewPager2中,通过禁用用户输入,您可以防止用户水平滑动。
viewPager.isUserInputEnabled = false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接