我要做的是什么:我正在尝试在程序运行时以编程方式启用/禁用分页器中的滑动
例如: 当我在流程上检查条件并且是否返回true
启用滑动时,如果条件返回false
禁用滑动。
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;
} }
然后选择此项而不是XML中的内置viewpager
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
你只需要调用&#34; setPagingEnabled&#34;使用&#34; false&#34;的方法并且用户无法刷到分页。
上述方法的问题:我无法在流上设置属性,I:e ....我可以启用滑动或禁用滑动。但我不能根据条件
这样做答案 0 :(得分:54)
以编程方式停用 -
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);
答案 1 :(得分:46)
最适合我的解决方案。 - 首先,你创建一个这样的类:
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 ? false : super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return disable ? false : 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);
我希望这能帮到你:)。
答案 2 :(得分:18)
在自定义视图寻呼机适配器中,覆盖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;
}
要启用,只需返回每个super
方法:
super.onInterceptTouchEvent(event)
和super.onTouchEvent(event)
。
答案 3 :(得分:3)
我找到了另一个适用于我的解决方案,请点击此链接
https://stackoverflow.com/a/42687397/4559365
它基本上覆盖方法canScrollHorizontally
以禁用手指滑动。无论setCurrentItem
如何仍然有效。
答案 4 :(得分:3)
简化解决方案,运行正常 这个覆盖方法必须在你的服装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);
}
答案 5 :(得分:2)
用于禁止刷卡
mViewPager.beginFakeDrag();
用于启用刷卡
if (mViewPager.isFakeDragging())
mViewPager.endFakeDrag();
答案 6 :(得分:1)
这对我有用。
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);
答案 7 :(得分:1)
如果仅由于需要不可滑动的行为而想要扩展它,则不需要这样做。 ViewPager2提供了一个不错的属性,名为:isUserInputEnabled