Lo que estoy tratando de hacer: estoy tratando de habilitar / deshabilitar el deslizamiento en el localizador de manera programática cuando el programa se está ejecutando
Ej .: Cuando esté en el flujo si verifico una condición y si regresa,true
habilite el deslizamiento, y si la condición regresafalse
deshabilite el deslizamiento.
La solución que estoy usando es esta
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;
} }
Luego, seleccione esto en lugar del visor incorporado en XML
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Solo necesita llamar al método "setPagingEnabled" con "false" y los usuarios no podrán deslizar el dedo para paginar.
Problema con la metodología anterior: no puedo establecer la propiedad en el flujo, yo: e .... Puedo habilitar el deslizamiento o deshabilitar el deslizamiento. Pero no puedo hacer esto por condición
Pregunta:
- ¿Puedo lograr mi objetivo de alguna otra manera? Si es así, ¿cuál es?
- O esto no es posible ?
android
android-viewpager
Devrath
fuente
fuente
Respuestas:
Deshabilitar el deslizamiento de forma progresiva
final View touchView = findViewById(R.id.Pager); touchView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
y usa esto para deslizar manualmente
touchView.setCurrentItem(int index);
fuente
La mejor solución para mi -Primero, creas una clase como esta:
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; } }
-Entonces cambia esto en tu diseño:
<android.support.v4.view.ViewPager
para esto<com.mypackage.CustomViewPager
-Finalmente, puedes deshabilitarlo:
view_pager.disableScroll(true);
o habilitarlo:view_pager.disableScroll(false);
Espero que esto te ayude :)
fuente
disable == true
. AnularonInterceptTouchEvent()
no es la solución correcta.En su adaptador de buscapersonas de vista personalizada, anule esos métodos en
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; }
Y para habilitar, simplemente devuelva cada
super
método:super.onInterceptTouchEvent(event)
ysuper.onTouchEvent(event)
.fuente
Para deshabilitar el deslizamiento
mViewPager.beginFakeDrag();
Para habilitar deslizar
if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();
fuente
En mi caso, la solución simplificada funcionó bien. El método de anulación debe estar en su adaptador de visor personalizado para anular a los oyentes de TouchEvent y hacer que se congelen;
@Override public boolean onTouchEvent(MotionEvent event) { return this.enabled && super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return this.enabled && super.onInterceptTouchEvent(event); }
fuente
this.enabled == false
. AnularonInterceptTouchEvent()
no es la solución correcta.Encontré otra solución que funcionó para mí siga este enlace
https://stackoverflow.com/a/42687397/4559365
Básicamente, anula el método
canScrollHorizontally
para deshabilitar el deslizamiento con el dedo. SinsetCurrentItem
embargo, todavía funciona.fuente
canScrollHorizontally()
método no tiene ningún efecto en el escenario actual. Ni siquiera se llama cuando ocurre el deslizamiento.Esto funcionó para mí.
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);
fuente
Si desea ampliarlo solo porque necesita un comportamiento No deslizable, no es necesario que lo haga. ViewPager2 proporciona una propiedad agradable llamada:
isUserInputEnabled
fuente