Android 是否可以禁用ViewPager上的滚动
我有一个Android 是否可以禁用ViewPager上的滚动,android,android-viewpager,Android,Android Viewpager,我有一个ViewPager,它实例化了一个视图。当搜索结果返回到视图时,我想暂时禁用viewpager和子按钮的滚动。我正在调用viewPager.setEnabled(false),但这并没有禁用它 有人有什么想法吗 一个简单的解决方案是创建自己的ViewPager子类,该子类具有私有布尔值标志,isPaginEnabled。然后重写onTouchEvent和onInterceptTouchEvent方法。如果ispaginenabled等于true,则调用super方法,否则return p
ViewPager
,它实例化了一个视图
。当搜索结果返回到视图时,我想暂时禁用viewpager和子按钮的滚动。我正在调用viewPager.setEnabled(false)
,但这并没有禁用它
有人有什么想法吗 一个简单的解决方案是创建自己的
ViewPager
子类,该子类具有私有布尔值
标志,isPaginEnabled
。然后重写onTouchEvent
和onInterceptTouchEvent
方法。如果ispaginenabled
等于true,则调用super
方法,否则return
public class CustomViewPager extends ViewPager {
private boolean isPagingEnabled = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
然后在Layout.XML
文件中,用
标记替换任何
标记
此代码是根据此代码改编的 斯莱顿的答案很好。 如果你想停止像猴子一样刷卡,你可以用
@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;
}
}
因此,您只能并排刷卡有一个简单的解决方法: 如果要禁用viewpager滚动,请执行以下操作:
mViewPager.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
return true;
}
});
当您想要重新启用它时,则:
mViewPager.setOnTouchListener(null);
这就可以了。这是我对斯莱顿答案的轻量级变体:
public class DeactivatableViewPager extends ViewPager {
public DeactivatableViewPager(Context context) {
super(context);
}
public DeactivatableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !isEnabled() || super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return isEnabled() && super.onInterceptTouchEvent(event);
}
}
使用我的代码,您可以使用
setEnable()
禁用分页。我找到了一个简单的解决方案
//disable swiping
mViewPager.beginFakeDrag();
//enable swiping
mViewPager.endFakeDrag();
这个怎么样:我使用了
CustomViewPager
接下来,覆盖scrollTo方法
我在做很多小的滑动时检查了移动,它不会滚动到其他页面
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public void scrollTo(int x, int y) {
if(enabled) {
super.scrollTo(x, y);
}
}
}
禁用刷卡
mViewPager.beginFakeDrag();
mViewPager.endFakeDrag();
启用刷卡
mViewPager.beginFakeDrag();
mViewPager.endFakeDrag();
对我有效的最佳解决方案是:
public class DeactivatedViewPager extends ViewPager {
public DeactivatedViewPager (Context context) {
super(context);
}
public DeactivatedViewPager (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean canScrollHorizontally(int direction) {
return false;
}
}
在此之后,触摸将禁用滚动,然后您仍然可以使用
setCurrentItem
方法更改页面。我建议另一种解决此问题的方法。想法是用滚动视图包装您的viewPager,这样当这个滚动视图不可滚动时,您的viewPager也不可滚动
以下是我的XML布局:
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</HorizontalScrollView>
不需要代码
对我来说很好。这里有一个关于Kotlin和androidX的答案
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager
class DeactivatedViewPager @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : ViewPager(context, attrs) {
var isPagingEnabled = true
override fun onTouchEvent(ev: MotionEvent?): Boolean {
return isPagingEnabled && super.onTouchEvent(ev)
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return isPagingEnabled && super.onInterceptTouchEvent(ev)
}
}
androidx中的新类ViewPager2允许使用方法setUserInPuneEnabled(false)禁用滚动
在我使用ViewPager 2 alpha 2的情况下,下面的代码段可以正常工作
viewPager.isUserInPuneEnabled=false
禁用用户输入的能力(SetUserInputened、IsUserInputened)
有关中的更多更改,请参阅此
此外,对最新版本的ViewPager 2 alpha 4进行了一些更改
方向和isUserScrollable属性不再是SavedState的一部分
请参阅此处了解更多更改,我基于从Java转换此答案创建了Kotlin版本: 没有内置的方法来禁用ViewPager页面之间的滑动,需要的是ViewPager的扩展,它覆盖onTouchEvent和onInterceptTouchEvent以防止滑动操作。为了使其更具普遍性,我们可以添加一个方法setswippaginabled来启用/禁用页面之间的滑动
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.setswippaginabled(false)
,用户将无法在页面之间滑动
更新
到2020年,我们现在有了。如果您想查看页面2,有一个内置的方法来禁用滑动:
myViewPager2.isUserInputEnabled=false
greate解决方案,工作正常。如果你想停止像猴子一样滑动,你可以用@override public void onPageScrollStateChanged(final int state){switch(state){case ViewPager.SCROLL\u state\u setting:mPager.setPaginEnabled(false)覆盖OnPageChangeListener;break;case ViewPager.SCROLL_STATE_IDLE:mPager.setpaginabled(true);break;}//noop}P.S:在XML中,用于添加另一个类似的解决方案,您可以使用名为“jazzyviewpage”的库,只需调用setpaginabled(布尔值)是否可以仅停止向右滚动?我只能向左滚动。例如,当使用游戏控制器或键盘时,仍然可以通过聚焦页面中的元素(按钮等)来“滚动”。如何完全禁用它?我想这是另一种应该被截获的事件……几乎,但不完全。触地仍然会发生,所以你可以通过大量的小滑动来移动页面。@Akhil Sekharan面临的问题正是Flynny在使用这个答案时所面临的问题。。但幸运的是,我不知道这个错误发生得有多突然……)工作起来很有魅力!!您可以进行大量的小滑动,因此您仍然需要在InterceptTouchEvent(MotionEvent)上使用公共布尔值{按slatons骑行回答:这就是你使用的所有代码吗?这对我不起作用。对我不起作用。仍然可以做很多小的滑动。这个代码不合适bcz它滚动得很慢,就像挂着视图一样。这可能是运气使然。更新ViewPager可以破解这个漏洞。它仍然在拖,但一点一点地拖(.可能的重复项我没有发现任何ViewPager的方法,例如SetPaginEnabled(布尔值)SetPaginEnabled(布尔值)将由您创建,因为没有此类方法可覆盖。不清楚这是什么SetPaginEnabled()
method没有。请包含完整的代码。我遇到的问题是,viewpager仍在进行小的滑动,但覆盖了View.scrollTo(int x,int y)
为我解决了这个问题。ThanksIt在某些情况下会导致一些奇怪的行为。比如去空白处,只留下一个空白页“-”滚动仍然是可能的,只是不再流畅。这基本上只是在没有解决问题的情况下降低了质量。重复回答在所有这些答案中,我觉得
<mypackage.SwipeLockableViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />