Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否可以禁用ViewPager上的滚动_Android_Android Viewpager - Fatal编程技术网

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" />