如何在 android 中禁用或启用 viewpager 滑动
How to disable or enable viewpager swiping in android
我正在尝试做的事情: 我正在尝试 Enable/disable 在程序 运行
时以编程方式在寻呼机中滑动
例如: 在流程中,如果我检查条件并且如果它 returns true
启用滑动,如果条件 returns false
禁用滑动。
Solution i am using is this one
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;
} }
然后 select 用这个代替 XML
中的内置 viewpager
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
只需要用"false"调用"setPagingEnabled"方法,用户将无法滑动分页。
上述方法的问题: 我无法在流程上设置 属性,I:e ....我可以启用刷卡或禁用刷卡.但我不能根据条件
这样做
问题:
- 我可以通过其他方式实现我的目标吗?如果可以的话是什么?
- 或者这是不可能的?
通过-
以编程方式禁用滑动
final View touchView = findViewById(R.id.Pager);
touchView.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
return true;
}
});
并使用它手动滑动
touchView.setCurrentItem(int index);
在您的自定义视图寻呼机适配器中,覆盖 ViewPager
中的那些方法。
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
要启用,只需 return 每个 super
方法:
super.onInterceptTouchEvent(event)
和 super.onTouchEvent(event)
.
我找到了另一个对我有用的解决方案link
它基本上覆盖了 canScrollHorizontally
方法来禁用手指滑动。然而 setCurrentItem
仍然有效。
这对我有用。
ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// disable swipe
if(!swipeEnabled) {
if (viewPager.getAdapter().getCount()>1) {
viewPager.setCurrentItem(1);
viewPager.setCurrentItem(0);
}
}
}
public void onPageScrollStateChanged(int state) {}
public void onPageSelected(int position) {}
};
viewPager.addOnPageChangeListener(onPageChangeListener);
对我来说最好的解决方案。
- 首先,你创建一个 class 这样的:
public class CustomViewPager extends ViewPager {
private Boolean disable = false;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs){
super(context,attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return !disable && super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !disable && super.onTouchEvent(event);
}
public void disableScroll(Boolean disable){
//When disable = true not work the scroll and when disble = false work the scroll
this.disable = disable;
}
}
-然后在您的布局中更改它:<android.support.v4.view.ViewPager
为此<com.mypackage.CustomViewPager
-终于可以禁用了:view_pager.disableScroll(true);
或启用它:view_pager.disableScroll(false);
希望对您有所帮助:)
就我而言,简化的解决方案效果很好。
覆盖方法必须在您的自定义 viewpager 适配器中以覆盖 TouchEvent 侦听器并使它们冻结;
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.enabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.enabled && super.onInterceptTouchEvent(event);
}
用于禁用滑动
mViewPager.beginFakeDrag();
启用滑动
if (mViewPager.isFakeDragging())
mViewPager.endFakeDrag();
如果您只是因为需要 Not-Swipeable 行为而想要扩展它,则不需要这样做。 ViewPager2 提供了很好的 属性 调用:isUserInputEnabled
要在 viewpager2 中禁用滑动,请使用
viewPager2.setUserInputEnabled(false);
要在 viewpager2 中启用滑动使用
viewPager2.setUserInputEnabled(true);
我正在尝试做的事情: 我正在尝试 Enable/disable 在程序 运行
时以编程方式在寻呼机中滑动例如: 在流程中,如果我检查条件并且如果它 returns true
启用滑动,如果条件 returns false
禁用滑动。
Solution i am using is this one
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;
} }
然后 select 用这个代替 XML
中的内置 viewpager<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
只需要用"false"调用"setPagingEnabled"方法,用户将无法滑动分页。
上述方法的问题: 我无法在流程上设置 属性,I:e ....我可以启用刷卡或禁用刷卡.但我不能根据条件
这样做问题:
- 我可以通过其他方式实现我的目标吗?如果可以的话是什么?
- 或者这是不可能的?
通过-
以编程方式禁用滑动 final View touchView = findViewById(R.id.Pager);
touchView.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
return true;
}
});
并使用它手动滑动
touchView.setCurrentItem(int index);
在您的自定义视图寻呼机适配器中,覆盖 ViewPager
中的那些方法。
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
要启用,只需 return 每个 super
方法:
super.onInterceptTouchEvent(event)
和 super.onTouchEvent(event)
.
我找到了另一个对我有用的解决方案link
它基本上覆盖了 canScrollHorizontally
方法来禁用手指滑动。然而 setCurrentItem
仍然有效。
这对我有用。
ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// disable swipe
if(!swipeEnabled) {
if (viewPager.getAdapter().getCount()>1) {
viewPager.setCurrentItem(1);
viewPager.setCurrentItem(0);
}
}
}
public void onPageScrollStateChanged(int state) {}
public void onPageSelected(int position) {}
};
viewPager.addOnPageChangeListener(onPageChangeListener);
对我来说最好的解决方案。 - 首先,你创建一个 class 这样的:
public class CustomViewPager extends ViewPager {
private Boolean disable = false;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs){
super(context,attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return !disable && super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !disable && super.onTouchEvent(event);
}
public void disableScroll(Boolean disable){
//When disable = true not work the scroll and when disble = false work the scroll
this.disable = disable;
}
}
-然后在您的布局中更改它:<android.support.v4.view.ViewPager
为此<com.mypackage.CustomViewPager
-终于可以禁用了:view_pager.disableScroll(true);
或启用它:view_pager.disableScroll(false);
希望对您有所帮助:)
就我而言,简化的解决方案效果很好。 覆盖方法必须在您的自定义 viewpager 适配器中以覆盖 TouchEvent 侦听器并使它们冻结;
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.enabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.enabled && super.onInterceptTouchEvent(event);
}
用于禁用滑动
mViewPager.beginFakeDrag();
启用滑动
if (mViewPager.isFakeDragging())
mViewPager.endFakeDrag();
如果您只是因为需要 Not-Swipeable 行为而想要扩展它,则不需要这样做。 ViewPager2 提供了很好的 属性 调用:isUserInputEnabled
要在 viewpager2 中禁用滑动,请使用
viewPager2.setUserInputEnabled(false);
要在 viewpager2 中启用滑动使用
viewPager2.setUserInputEnabled(true);