177 votes

Comment désactiver le swiping dans ViewPager2 ?

Est-il possible d'activer/désactiver le swiping dans le nouvel Android ? viewpager2 composant ?

368voto

Nilesh Rathod Points 34836

Il est maintenant possible d'activer ou de désactiver le swiping. viewpager2 en utilisant Version 1.0.0-alpha02

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

Version 1.0.0

Nouvelles fonctionnalités

  • Possibilité de désactiver la saisie par l'utilisateur ( setUserInputEnabled , isUserInputEnabled )

Changements d'API

  • ViewPager2 classe finale

Correction de bogues

  • FragmentStateAdapter corrections de stabilité

EXEMPLE DE CODE pour désactiver le swiping dans le viewpager2

myViewPager2.setUserInputEnabled(false);

EXEMPLE DE CODE pour activer le swiping dans le viewpager2

myViewPager2.setUserInputEnabled(true);

2 votes

Parfait. Maintenant je peux avoir un fragment de carte et le faire défiler et utiliser le swiping pour les autres fragments.

2 votes

Est-ce que cela désactive également le fait de toucher les onglets pour changer l'onglet actuel en un autre onglet spécifique ?

2 votes

Y a-t-il un moyen de faire cela en utilisant le xml ?

17voto

Dennis Points 11

Si vous utilisez Android Data Binding, vous pouvez simplement le désactiver dans votre fichier xml de mise en page.

app:userInputEnabled="@{false}"

13voto

Yamini Points 518
viewPager2.setUserInputEnabled(false);

6voto

Nikola Despotoski Points 13670

Sous le capot ViewPager2 travaille avec RecyclerView pour gonfler les vues des fragments, mais l'option RecyclerView est caché, ce qui le rend plus facile à comprendre.

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

La méthode la plus simple consiste à récupérer l'enfant à la position zéro, qui est le numéro d'identification de l'enfant. RecyclerView et désactiver le défilement dans le gestionnaire de mise en page, en enveloppant le gestionnaire de mise en page :

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

}

Veuillez noter que si l'API modifie le gestionnaire de mise en page utilisé pour le RecyclerView, c'est-à-dire s'il s'éloigne de l'option LinearLayoutManager cela ne fonctionnera pas et il faudra que certaines méthodes soient surchargées et que les super méthodes soient appelées.

La deuxième approche consiste à sous-classer l ViewPager2 qui est ViewGroup et ensuite intercepter les événements de contact, avant qu'ils ne soient distribués aux vues enfant (comme vous pouvez le deviner, l'option RecyclerView ) et veillez à ne pas empêcher les clics.

12 votes

Est impossible car viewPages2 est final.

5 votes

Au moment où ma réponse a été postée, ViewPager2 était ouvert.

2 votes

Désolé, mais créer une classe séparée pour cela est une mauvaise pratique. Kotlin et VP2 proposent cette courte ligne simple pager.userInputEnabled = false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X