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.onTouchEventtiene muchas cosas buenas que no desea cambiar, como permitir que las vistas de los niños obtengan toques.onInterceptTouchEventes 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
srccarpeta: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
LinearLayoutay está destinado a ocupar toda la pantalla, razón por la cuallayout_weightes 1 ylayout_heightay es 0dp.Y el
setMyScroller();método es para una transición suavefuente
0dpaltura /1peso sobre lamatch_parentaltura 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
ViewPagersería crear unSetPagingEnabledmétodo para que podamos habilitar y deshabilitar la paginación sobre la marcha. Para habilitar / deshabilitar el deslizamiento, simplemente anule dos métodos:onTouchEventyonInterceptTouchEvent. Ambos devolverán "falso" si se deshabilitó la paginación.Luego seleccione esto en lugar del visor incorporado en XML
Solo necesita llamar al
setPagingEnabledmétodofalsey los usuarios no podrán deslizarse para paginar.fuente
onTouchEventyonInterceptTouchEventmétodos conreturn enabled && super.onTouchEvent(event);La forma más simple es
setOnTouchListenervolver ytrueparaViewPager.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
onTouchEventyonInterceptTouchEventno 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
canScrollHorizontallymétodo.Ver
LockableViewPagerimplementación a continuación.fuente
Ahora no necesitamos crear personalizados
ViewPagerUn nuevo
ViewPager2nombre Ver disponible en AndroidViewPager2admite paginación vertical además de la paginación horizontal tradicional. Puede habilitar la paginación vertical para unViewPager2elemento estableciendo suandroid:orientationatributoPara deshabilitar el deslizamiento en
viewpager2usoPara habilitar el deslizamiento en
viewpager2usopara 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
viewpager2conRecyclerView.AdapterSi está extendiendo desde ViewPager, también debe anular
executeKeyEventcomo 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
onPageSelectedejecutará 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
OnClickListenera 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
setClickablelugar desetOnClickListener, si no necesita manejar elonClickevento.Escribí un
CustomViewPagercon un control deslizante:Si se establece
canScrollquetrue, esteViewPagerpuede birlar con el dedo,falsepor 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-extensionscomplemento 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 delonInterceptTouchEventmé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
truepara 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
ImageViewsyViewPager, 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 funcionaViewPagersolo.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
ViewpagerMétodo 1-OverrideonInterceptTouchEventyonTouchEvent2- crea el tuyo
GestureDetector3- 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