J'ai ViewPager et en dessous, j'ai 10 boutons. En cliquant sur le bouton, par exemple # 4, le pager passe immédiatement à la page # 4 de mPager.setCurrentItem(3);
. Mais, je veux désactiver la pagination en glissant avec le doigt horizontalement. Ainsi, la pagination se fait UNIQUEMENT en cliquant sur les boutons. Alors, comment puis-je désactiver le balayage avec le doigt?
android
android-viewpager
théatre
la source
la source
Réponses:
Vous devez sous-classer
ViewPager
.onTouchEvent
contient beaucoup de bonnes choses que vous ne voulez pas changer, comme autoriser les vues enfants à toucher.onInterceptTouchEvent
c'est ce que vous voulez changer. Si vous regardez le code pourViewPager
, vous verrez le commentaire:Voici une solution complète:
Tout d'abord, ajoutez cette classe à votre
src
dossier:Ensuite, assurez-vous d'utiliser cette classe au lieu de la régulière
ViewPager
, que vous avez probablement spécifiée commeandroid.support.v4.view.ViewPager
. Dans votre fichier de mise en page, vous voudrez le spécifier avec quelque chose comme:Cet exemple particulier est dans un
LinearLayout
et est destiné à occuper tout l'écran, c'est pourquoilayout_weight
est 1 etlayout_height
est 0dp.Et la
setMyScroller();
méthode est pour une transition en douceurla source
0dp
taille /1
poids plutôt que lamatch_parent
hauteur pour obtenir l'effet plein écran? Améliorez-vous les performances en procédant ainsi?executeKeyEvent()
. C'est la méthode qui appelle ensuiteallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
L'extension plus générale de
ViewPager
serait de créer uneSetPagingEnabled
méthode afin que nous puissions activer et désactiver la pagination à la volée. Pour activer / désactiver le balayage, remplacez simplement deux méthodes:onTouchEvent
etonInterceptTouchEvent
. Les deux renverront "false" si la pagination a été désactivée.Sélectionnez ensuite ceci au lieu du viewpager intégré en XML
Il vous suffit d'appeler la
setPagingEnabled
méthode avecfalse
et les utilisateurs ne pourront pas glisser pour paginer.la source
onTouchEvent
etonInterceptTouchEvent
avecreturn enabled && super.onTouchEvent(event);
La façon la plus simple est de
setOnTouchListener
et retourtrue
pourViewPager
.la source
pager.setCurrentItem(pager.getCurrentItem());
avant de revenirtrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
dans mon adaptateur, ce qui force la recréation des pages et peut-être aussi la résolution d'autres problèmes.Mieux vaut le déclarer styleable, donc vous pouvez changer sa propriété de xml:
Et dans vos valeurs / attr.xml:
afin que vous puissiez l'utiliser dans votre mise en page xml:
Bien sûr, vous pouvez toujours avoir une propriété get / set.
la source
Remplacement uniquement
onTouchEvent
etonInterceptTouchEvent
ne suffit pas si vous avez ViewPager lui-même dans un autre ViewPager. Le ViewPager enfant volerait les événements tactiles de défilement horizontal du ViewPager parent à moins qu'il ne soit positionné sur sa première / dernière page.Pour que cette configuration fonctionne correctement, vous devez également remplacer la
canScrollHorizontally
méthode.Voir
LockableViewPager
implémentation ci-dessous.la source
Maintenant, nous n'avons plus besoin de créer de coutume
ViewPager
Un nouveau
ViewPager2
nom Voir disponible dans AndroidViewPager2
prend en charge la pagination verticale en plus de la pagination horizontale traditionnelle. Vous pouvez activer la pagination verticale pour unViewPager2
élément en définissant sonandroid:orientation
attributPour désactiver le balayage en cours d'
viewpager2
utilisationPour activer le balayage en cours d'
viewpager2
utilisationpour plus d'informations, vérifiez ceci
MISE À JOUR
Veuillez vérifier: Migrer de ViewPager vers ViewPager2
Pour un exemple complet, veuillez vérifier cette utilisation de ViewPager2 dans Android
la source
viewpager2
avecRecyclerView.Adapter
Si vous étendez à partir de ViewPager, vous devez également remplacer
executeKeyEvent
comme indiqué précédemment par @araksParce que certains appareils comme la Galaxy Tab 4 10 'affichent ces boutons là où la plupart des appareils ne les montrent jamais:
la source
Pour désactiver le balayage
Pour activer le balayage
la source
Je devais désactiver le balayage sur une page spécifique et lui donner une belle animation élastique, voici comment:
la source
onPageSelected
sera exécuté. Même la page suivante changera. Donc, ce code n'a pas besoin.Je sais qu'il est très tard pour publier ceci, mais voici un petit hack pour atteindre votre résultat;)
Ajoutez simplement une vue factice sous votre viseur:
Ajoutez ensuite un
OnClickListener
à votreRelativeLayout
.Soyez un peu créatif avec les mises en page, leurs emplacements et leur comportement et vous apprendrez à trouver un moyen de faire absolument tout ce que vous imaginez :)
Bonne chance!
la source
setClickable
place desetOnClickListener
, si vous n'avez pas besoin de gérer l'onClick
événement.J'ai écrit un
CustomViewPager
avec un contrôle de balayage:Si vous définissez
canScroll
àtrue
, ceViewPager
peut être glisser avec le doigt,false
au contraire.Je l'utilise dans mon projet, et cela fonctionne très bien jusqu'à présent.
la source
J'ai utilisé cette classe avec succès. La redéfinition de executeKeyEvent est nécessaire pour éviter de glisser à l'aide de flèches sur certains appareils ou pour l'accessibilité:
Et dans le xml, appelez-le comme ceci:
la source
performClick()
méthode n'est pas remplacée.Dans Kotlin, ma solution, combinant les réponses ci-dessus.
la source
onInterceptTouchEvent()
empêchera les vues enfants de recevoir des entrées. Dans la plupart des cas, ce n'est pas le comportement souhaité.Dans kotlin, nous pouvons résoudre ce problème en créant un widget personnalisé héritant de la classe ViewPager et en ajoutant une valeur d'indicateur pour contrôler le comportement de balayage.
NoSwipePager.kt
En xml
Désactivez le balayage par programmation. Si le
kotlin-android-extensions
plugin est appliqué dans build.gradle , le balayage peut être désactivé en écrivant le code ci-dessous.Sinon, nous pouvons désactiver le balayage à l'aide du code ci-dessous:
la source
onInterceptTouchEvent()
empêchera les vues enfants de recevoir des entrées. Dans la plupart des cas, ce n'est pas le comportement souhaité.super.onInterceptTouchEvent(event)
ces vues ne recevront aucune entrée (ce qui est l'objectif documenté de laonInterceptTouchEvent
méthode).onInterceptTouchEvent()
méthode prioritaire l' empêche (le contenu) de recevoir des entrées.Essayez de remplacer et de renvoyer true depuis onInterceptTouchEvent () et / ou onTouchEvent () , qui consommera les événements tactiles sur le pager.
la source
true
pour laisser entendre que l'événement tactile a été géré?Une autre solution simple pour désactiver le balayage sur une page spécifique (dans cet exemple, page 2):
la source
la source
Si vous écrivez une galerie d'images avec
ImageView
s etViewPager
, qui prend en charge le zoom et le panoramique, voyez une solution simple décrite ici: Implémentation d'une ImageView zoomable en étendant le ViewPager par défaut dans Phimpme Android (et exemple Github - PhotoView ). Cette solution ne fonctionne pasViewPager
seule.la source
Si vous utilisez ViewPager2, il vous suffit d'utiliser:
viewpager.setUserInputEnabled(false);
De la documentation :
Merci à: https://stackoverflow.com/a/61685871/9026710
la source
Si vous souhaitez implémenter la même chose pour Android dans Xamarin, voici une traduction en C #
J'ai choisi de nommer l'attribut " ScrollEnabled ". Parce que iOS utilise simplement le même nom excat. Ainsi, vous avez un nom égal sur les deux plates-formes, ce qui facilite la tâche des développeurs.
Dans le fichier .axml:
la source
Aucun des codes ci-dessus ne fonctionne correctement. J'ai essayé ceci
la source
voici mon implémentation
que si vous souhaitez désactiver l'animation de balayage, vous pouvez utiliser le swipeListener à gauche et à droite et toujours vouloir le défilement au doigt mais sans animation
Viewpager
Méthode 1-OverrideonInterceptTouchEvent
etonTouchEvent
2- Créez le vôtre
GestureDetector
3- détecter le geste de glissement et utiliser le
setCurrentItem(item, false)
ViewPager
le lorsque vous êtes configuré le ViewPager définir le swipeListener
la source
Je viens de personnaliser un peu le viseur et de désactiver facilement le balayage.
la source
la source