我有一个ViewPager
,它实例化了一个View
。 我想在搜索结果返回到视图时短暂地禁用viewpager和子按钮的滚动。 我已经调用了viewPager.setEnabled(false)
,但这并没有禁用它们。
有人有任何想法吗?
我有一个ViewPager
,它实例化了一个View
。 我想在搜索结果返回到视图时短暂地禁用viewpager和子按钮的滚动。 我已经调用了viewPager.setEnabled(false)
,但这并没有禁用它们。
有人有任何想法吗?
ViewPager
子类,它有一个私有布尔标志 isPagingEnabled
。然后覆盖 onTouchEvent
和 onInterceptTouchEvent
方法。如果isPagingEnabled
为 true,调用 super
方法;否则直接返回。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
文件中,将所有的 <com.android.support.V4.ViewPager>
标签替换为 <com.yourpackage.CustomViewPager>
标签。
这段代码是从这篇博客文章中改编而来的。
这个问题有一个简单的解决方法:
当你想禁用viewpager滚动时:
mViewPager.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
return true;
}
});
如果您想重新启用它,那么:
mViewPager.setOnTouchListener(null);
那就可以搞定了。
这里是我对Slayton答案的轻量级变体:
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()
来禁用分页。
onInterceptTouchEvent()
方法将防止子视图接收输入。在大多数情况下,这不是预期的行为。 - Alex Semeniuk我找到了一个简单的解决方案。
//disable swiping
mViewPager.beginFakeDrag();
//enable swiping
mViewPager.endFakeDrag();
在我使用 ViewPager 2 alpha 2 的情况下,以下代码片段有效:
viewPager.isUserInputEnabled = false
能够禁用用户输入(setUserInputEnabled、isUserInputEnabled)
有关更多更改,请参见viewpager2 1.0.0-alpha02
此外,最新版本的 ViewPager 2 alpha 4 还进行了一些更改。
方向和 isUserScrollable 属性不再是 SavedState 的一部分。
有关更多更改,请参见viewpager2#1.0.0-alpha04
我建议另一种解决这个问题的方法。思路是使用一个scrollView包裹您的viewPager,这样当scrollView不可滚动时,您的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>
无需代码。
对我来说很有效。
禁用滑动
mViewPager.beginFakeDrag();
mViewPager.endFakeDrag();
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)
}
}
以下是具体步骤:
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
方法来更改页面。
您的翻译内容如下:
这个怎么样:
我使用了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);
}
}
}
View.scrollTo(int x, int y)
方法解决了我的问题。谢谢。 - Palm