Tengo ViewPager y debajo tengo 10 botones. Al hacer clic en el botón, por ejemplo # 4, el localizador va inmediatamente a la página # 4 por mPager.setCurrentItem(3);
. Pero, quiero desactivar la paginación deslizando con el dedo horizontalmente. Por lo tanto, la búsqueda se realiza SOLO haciendo clic en los botones. Entonces, ¿cómo puedo desactivar el deslizamiento con el dedo?
android
android-viewpager
teatral
fuente
fuente
Respuestas:
Necesitas subclase
ViewPager
.onTouchEvent
tiene muchas cosas buenas que no desea cambiar, como permitir que las vistas de los niños obtengan toques.onInterceptTouchEvent
es lo que quieres cambiar. Si miras el códigoViewPager
, verás el comentario:Aquí hay una solución completa:
Primero, agregue esta clase a su
src
carpeta:A continuación, asegúrese de usar esta clase en lugar de la regular
ViewPager
, que probablemente especificó comoandroid.support.v4.view.ViewPager
. En su archivo de diseño, querrá especificarlo con algo como:Este ejemplo en particular está en
LinearLayout
ay está destinado a ocupar toda la pantalla, razón por la cuallayout_weight
es 1 ylayout_height
ay es 0dp.Y el
setMyScroller();
método es para una transición suavefuente
0dp
altura /1
peso sobre lamatch_parent
altura para lograr el efecto de pantalla completa? ¿Obtiene mejoras de rendimiento al hacerlo?executeKeyEvent()
. Este es el método que luego llamaallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
La extensión más general de
ViewPager
sería crear unSetPagingEnabled
método para que podamos habilitar y deshabilitar la paginación sobre la marcha. Para habilitar / deshabilitar el deslizamiento, simplemente anule dos métodos:onTouchEvent
yonInterceptTouchEvent
. Ambos devolverán "falso" si se deshabilitó la paginación.Luego seleccione esto en lugar del visor incorporado en XML
Solo necesita llamar al
setPagingEnabled
métodofalse
y los usuarios no podrán deslizarse para paginar.fuente
onTouchEvent
yonInterceptTouchEvent
métodos conreturn enabled && super.onTouchEvent(event);
La forma más simple es
setOnTouchListener
volver ytrue
paraViewPager
.fuente
pager.setCurrentItem(pager.getCurrentItem());
antes de regresartrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
en mi adaptador, lo que obliga a la recreación de las páginas y tal vez también resuelva otros problemas.Es mejor declararlo con estilo, para que pueda cambiar su propiedad de xml:
Y en sus valores / attr.xml:
para que pueda usarlo en su diseño xml:
Por supuesto, aún puede tener una propiedad get / set.
fuente
Anulando solo
onTouchEvent
yonInterceptTouchEvent
no es suficiente en caso de que tenga ViewPager dentro de otro ViewPager. El ViewPager secundario robaría los eventos táctiles de desplazamiento horizontal del ViewPager primario a menos que se coloque en su primera / última página.Para que esta configuración funcione correctamente, debe anular también el
canScrollHorizontally
método.Ver
LockableViewPager
implementación a continuación.fuente
Ahora no necesitamos crear personalizados
ViewPager
Un nuevo
ViewPager2
nombre Ver disponible en AndroidViewPager2
admite paginación vertical además de la paginación horizontal tradicional. Puede habilitar la paginación vertical para unViewPager2
elemento estableciendo suandroid:orientation
atributoPara deshabilitar el deslizamiento en
viewpager2
usoPara habilitar el deslizamiento en
viewpager2
usopara más información revisa esto
ACTUALIZAR
Verifique: migrar de ViewPager a ViewPager2
Para ver un ejemplo completo, consulte este Uso de ViewPager2 en Android
fuente
viewpager2
conRecyclerView.Adapter
Si está extendiendo desde ViewPager, también debe anular
executeKeyEvent
como se indicó anteriormente por @araksDebido a que algunos dispositivos como el Galaxy Tab 4 10 'muestran estos botones donde la mayoría de los dispositivos nunca los muestran:
fuente
Para deshabilitar deslizar
Para habilitar deslizar
fuente
Necesitaba deshabilitar el deslizamiento en una página específica y darle una buena animación de goma, así es como:
fuente
onPageSelected
ejecutará un código para la siguiente página . Incluso la siguiente página cambiará. Entonces, este código no es necesario.Sé que es muy tarde para publicar esto, pero aquí hay un pequeño truco para lograr su resultado;)
Simplemente agregue una vista ficticia debajo de su visor:
Luego agregue un
OnClickListener
a suRelativeLayout
.Sea un poco creativo con los diseños, sus ubicaciones y su comportamiento, y aprenderá a encontrar la manera de hacer absolutamente todo lo que imagina :)
¡Buena suerte!
fuente
setClickable
lugar desetOnClickListener
, si no necesita manejar elonClick
evento.Escribí un
CustomViewPager
con un control deslizante:Si se establece
canScroll
quetrue
, esteViewPager
puede birlar con el dedo,false
por el contrario.Lo uso en mi proyecto, y funciona muy bien hasta ahora.
fuente
Usé esta clase con éxito. Se requiere anular el executeKeyEvent para evitar deslizar el dedo usando flechas en algunos dispositivos o para accesibilidad:
Y en el xml llámalo así:
fuente
performClick()
método no se anula.En Kotlin, mi solución, combina las respuestas anteriores.
fuente
onInterceptTouchEvent()
evitará que las vistas secundarias reciban información. En la mayoría de los casos, este no es el comportamiento previsto.En kotlin, podemos resolver esto creando un widget personalizado que herede la clase ViewPager y agregando un valor de indicador para controlar el comportamiento de deslizamiento.
NoSwipePager.kt
En xml
Inhabilita el deslizamiento mediante programación. Si el
kotlin-android-extensions
complemento se aplica en build.gradle , el deslizamiento se puede desactivar escribiendo el siguiente código.De lo contrario, podemos desactivar el deslizamiento usando el código a continuación:
fuente
onInterceptTouchEvent()
evitará que las vistas secundarias reciban información. En la mayoría de los casos, este no es el comportamiento previsto.super.onInterceptTouchEvent(event)
resultados en estas vistas que no reciben ninguna entrada (que es el propósito documentado delonInterceptTouchEvent
método).onInterceptTouchEvent()
método de anulación evita que (contenido) reciba entradas.Intente anular y devolver true desde onInterceptTouchEvent () y / o onTouchEvent () , que consumirá eventos táctiles en el buscapersonas.
fuente
true
para implicar que se ha manejado el evento táctil?Otra solución fácil para desactivar el deslizamiento en una página específica (en este ejemplo, página 2):
fuente
fuente
Si escribe una galería de imágenes con
ImageView
syViewPager
, que admite zoom y panorámica, vea una solución simple que se describe aquí: Implementar un ImageView con zoom extendiendo el ViewPager predeterminado en Phimpme Android (y muestra de Github - PhotoView ). Esta solución no funcionaViewPager
solo.fuente
Si está utilizando ViewPager2 solo tiene que usar:
viewpager.setUserInputEnabled(false);
De los documentos :
Gracias a: https://stackoverflow.com/a/61685871/9026710
fuente
Si desea implementar lo mismo para Android en Xamarin, aquí hay una traducción a C #
Elegí nombrar el atributo " ScrollEnabled ". Porque iOS solo usa el mismo nombre de excat. Por lo tanto, tiene un nombre igual en ambas plataformas, lo que facilita a los desarrolladores.
En archivo .axml:
fuente
Ninguno de los códigos anteriores funciona sin problemas. Intenté esto
fuente
aquí está mi implementación
que si desea deshabilitar la animación de deslizamiento, puede usar el deslizador de deslizamiento hacia la izquierda y hacia la derecha y aún así desea el desplazamiento con el dedo pero sin animación
Viewpager
Método 1-OverrideonInterceptTouchEvent
yonTouchEvent
2- crea el tuyo
GestureDetector
3- detecta el gesto de deslizar y usa el
setCurrentItem(item, false)
ViewPager
el cuando está configurado el ViewPager establece el swipeListener
fuente
Acabo de personalizar un poco el visor y deshabilito el deslizamiento fácilmente.
fuente
fuente