Как отключить или включить прокрутку viewpager в android
то, что я пытаюсь сделать: Я пытаюсь включить / отключить прокрутку в пейджере программно, когда программа работает
Ex: когда на потоке, если я проверяю условие и если он возвращает 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;
} }
затем выберите это вместо встроенного viewpager в XML
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
вам просто нужно вызвать метод " setPagingEnabled "с помощью" false", и пользователи не смогут прокручивать страницы.
проблема с вышеуказанной методологией: Я не могу установить свойство в потоке, т. е.... Я могу включить или отключить смахивание пальцем. Но я не могу сделать это на основе условия
вопрос:
- могу ли я достичь своей цели каким-то другим способом, если да, то что это такое ?
- или это невозможно ?
6 ответов:
отключить салфетки прогматически-
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);
лучшее решение для меня. - Во-первых, вы создаете такой класс:
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);
Я надеюсь, что это поможет вам :)
в вашем пользовательском адаптере пейджера просмотра переопределите эти методы в
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)
.
Я нашел другое решение, которое сработало для меня перейдите по этой ссылке
https://stackoverflow.com/a/42687397/4559365
он в основном переопределяет метод
canScrollHorizontally
чтобы отключить считывание пальцем. ПонесенныеsetCurrentItem
до сих пор работает.
упрощенное решение, просто отлично работает эти методы переопределения должны быть в вашем адаптере 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); }
это сработало для меня.
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);