我有一个ViewPager
,它实例化了一个View
。 我想在搜索结果返回到视图时短暂地禁用viewpager和子按钮的滚动。 我已经调用了viewPager.setEnabled(false)
,但这并没有禁用它们。
有人有任何想法吗?
我有一个ViewPager
,它实例化了一个View
。 我想在搜索结果返回到视图时短暂地禁用viewpager和子按钮的滚动。 我已经调用了viewPager.setEnabled(false)
,但这并没有禁用它们。
有人有任何想法吗?
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
}
}
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
}
}
<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
新的ViewPager2类来自androidx,可以使用setUserInputEnabled(false)方法禁用滚动。
private val pager: ViewPager2 by bindView(R.id.pager)
override fun onCreate(savedInstanceState: Bundle?) {
pager.isUserInputEnabled = false
}
这对我有效:-(对于ViewPager2)
viewPager.isUserInputEnabled = false
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;
}
}
所以你只能左右滑动
setPagingEnabled()
方法的作用。请包含完整的代码。 - Alex SemeniukviewPager.isUserInputEnabled = false