¿Cómo deshabilitar el deslizamiento en ViewPager2?

2 minutos de lectura

avatar de usuario
murguupluoglu

¿Es posible habilitar o deshabilitar el deslizamiento en el nuevo Android? viewpager2 ¿componente?

avatar de usuario
Pregúntale a Nilesh

Ahora es posible habilitar o deshabilitar el deslizamiento viewpager2 usando Version 1.0.0-alpha02

Usar implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'

Versión 1.0.0

Nuevas características

  • Posibilidad de deshabilitar la entrada del usuario (setUserInputEnabled, isUserInputEnabled)

Cambios en la API

  • ViewPager2 final de clase

Corrección de errores

  • FragmentStateAdapter correcciones de estabilidad

CÓDIGO DE MUESTRA para deshabilitar el deslizamiento en viewpager2

myViewPager2.setUserInputEnabled(false);

CÓDIGO DE MUESTRA para permitir deslizar en viewpager2

myViewPager2.setUserInputEnabled(true);

  • Perfecto. Ahora puedo tener un fragmento de mapa y desplazarlo y deslizar el dedo para los otros fragmentos.

    – FrankKrumnow

    19 oct 2020 a las 11:19

  • ¿Esto también deshabilita tocar las pestañas para cambiar la pestaña actual a otra pestaña específica?

    – Andrei Malla

    4 de noviembre de 2020 a las 12:05


  • ¿Hay alguna manera de hacer esto usando xml?

    – todos

    18 de marzo de 2021 a las 6:03

  • @aLL no hay forma de hacer esto usando XML en este momento

    – Pregúntale a Nilesh

    18 de marzo de 2021 a las 6:37

Si está utilizando el enlace de datos de Android, simplemente puede deshabilitarlo en su archivo xml de diseño.

app:userInputEnabled="@{false}"

avatar de usuario
Yaminí

viewPager2.setUserInputEnabled(false);

avatar de usuario
Nikola Despotoski

Bajo el capó ViewPager2 funciona con RecyclerView para inflar las vistas de fragmentos, pero el RecyclerView está oculto, por lo que lo hacen más a prueba de idiotas.

 val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
 rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)

Hacky forma es conseguir que el niño en la posición cero que es el RecyclerView y deshabilite el desplazamiento en el administrador de diseño, envolviendo el administrador de diseño:

inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
    LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout) {

    override fun canScrollVertically(): Boolean  = layoutManager.orientation == HORIZONTAL


    override fun canScrollHorizontally(): Boolean  =  layoutManager.orientation == VERTICAL

}

Tenga en cuenta que si la API cambia el administrador de diseño utilizado para RecyclerView, es decir, se alejan del LinearLayoutManager esto no funcionará y necesitará algunos métodos anulados y garantizar que se llamen a los supermétodos.

El segundo enfoque es la subclase ViewPager2 cual es ViewGroup y luego haga la magia de interceptar eventos táctiles, antes de que se envíen a las vistas secundarias (como supondrá que el RecyclerView) y tenga cuidado de no impedir los clics.

¿Ha sido útil esta solución?