Comment désactiver la pagination en balayant l'écran avec un doigt dans la ViewPager mais encore être en mesure de passer par programmation?
J'ai ViewPager et en dessous j'ai 10 boutons. En cliquant sur le bouton, par exemple #4, le pager va immédiatement à la page #4 par mPager.setCurrentItem(3);
. Mais, je veux désactiver la pagination en balayant l'écran avec le doigt horizontalement. Ainsi, la pagination se fait SEULEMENT en cliquant sur les boutons.
Donc, comment je peux désactiver le glisser avec le doigt?
- Comment sur l'utilisation de ViewFlipper en premier lieu? Il va vous faire économiser beaucoup de maux de tête.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin à la sous-classe
ViewPager
.onTouchEvent
a beaucoup de bonnes choses dans ce que vous ne voulez pas changer comme permettant à l'enfant de vues pour obtenir de touche.onInterceptTouchEvent
est ce que vous voulez changer. Si vous regardez le code pourViewPager
, vous pourrez voir le commentaire:Voici une solution complète:
Tout d'abord, ajoutez cette classe à votre
src
dossier:Ensuite, assurez-vous que l'utilisation de cette classe au lieu de l'ordinaire
ViewPager
, qui vous a probablement spécifié commeandroid.support.v4.view.ViewPager
. Dans votre fichier de mise en page, vous aurez envie de le spécifier avec quelque chose comme:Cet exemple particulier est dans un
LinearLayout
et est destiné à prendre la totalité de l'écran, c'est pourquoilayout_weight
est 1 etlayout_height
est 0dp.Et
setMyScroller();
méthode est pour une transition en douceur0dp
hauteur/1
de poids solution surmatch_parent
de la hauteur pour atteindre le plein effet écran? Pouvez-vous obtenir des améliorations de performances en faisant de la sorte?arrowScroll()
de la même manière les autres méthodes sont substituées (ou le même que celui proposé dans la réponse par @Rajul ).executeKeyEvent()
. C'est la méthode qui ensuite appelerallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
onInterceptTouchEvent()
- elle permettra d'éviter les vues enfant de recevoir des commentaires. Deuxièmement, ne pas utiliser la réflexion pour accéder aux champs privés (en particulier dans les systèmes de production) - vous pourriez avoir des problèmes dans l'avenir. Troisièmement, lire de la documentation sur ce résultatonTouchEvent()
devrait revenir. De suite, pour désactiver 'balaye par peu", vous pouvez essayer de substitution de la méthode suivante:protected void onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) { scrollTo(0, 0); }
.L'extension plus générale de
ViewPager
serait de créer unSetPagingEnabled
méthode afin que nous puissions activer et de désactiver la pagination à la volée.Pour activer /désactiver le balayage, juste annuler deux méthodes:
onTouchEvent
etonInterceptTouchEvent
. Les deux renvoie "false" si la pagination a été désactivé.Puis sélectionnez ceci à la place de l'intégré dans viewpager en XML
Vous avez juste besoin d'appeler le
setPagingEnabled
méthode avecfalse
et les utilisateurs ne seront pas en mesure de passer à la pagination.onTouchEvent
etonInterceptTouchEvent
méthodes avecreturn enabled && super.onTouchEvent(event);
setPagingEnabled()
méthode une fois que vous déclarez votreViewPager
comme ceci:CustomViewPager yourCustomViewPager = (CustomViewPager) findViewById(R.id.yourCustomViewPager); yourCustomViewPager.setPagingEnabled(false)
false
dansonTouchEvent()
etonInterceptTouchEvent()
? Cette façon de toucher le pager titres (ou icônes) de le faire glisser. Retourtrue
au lieu de désactiver aussi.La façon la plus simple est de
setOnTouchListener
et retourtrue
pourViewPager
.pager.setCurrentItem(pager.getCurrentItem());
avant de retournertrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
dans ma carte, où les forces de loisirs de pages et peut-être de résoudre d'autres problèmes.Mieux de déclarer qu'il styleable, de sorte que vous pouvez modifier sa propriété à partir de xml:
Et dans votre values/attr.xml:
de sorte que vous pouvez utiliser dans votre mise en page xml:
Bien sûr, vous pouvez toujours avoir un get/set de la propriété.
Impératif que
onTouchEvent
etonInterceptTouchEvent
n'est pas suffisante dans le cas où vous avez ViewPager lui-même à l'intérieur d'un autre ViewPager. Enfant ViewPager serait voler de défilement horizontale événements tactiles du parent ViewPager sauf s'il est placé sur sa première /dernière page.Pour faire de ce programme d'installation fonctionne correctement, vous devez avoir à remplacer également le
canScrollHorizontally
méthode.Voir
LockableViewPager
de mise en œuvre ci-dessous.Si vous êtes s'étendant à partir de ViewPager, vous devez également remplacer
executeKeyEvent
comme indiqué précédemment par @araxeParce que certains appareils comme le Galaxy Tab 4 10 " afficher ces boutons où la plupart des appareils ne jamais les montrer:
Pour désactiver le balayage
Pour activer le balayage
Maintenant, nous n'avons besoin de créer des
ViewPager
Une nouvelle
ViewPager2
nom de la Vue disponible sur l'androidPour désactiver le balayage en
viewpager2
utilisationPour permettre de glisser dans
viewpager2
Utilisationpour plus d'informations consultez cette
J'avais besoin de désactiver le balayage sur une page spécifique, et de leur donner une belle bande de caoutchouc d'animation, voici comment faire:
onPageSelected
sera exécuté. Même la prochaine page va changer. Donc, ce code ne fait pas dans le besoin.J'ai écrit un
CustomViewPager
avec un balayage de contrôle:Si vous définissez
canScroll
àtrue
, ceViewPager
peut être glissant avec le doigt,false
au contraire.Je l'utiliser dans mon projet, et il fonctionne très bien jusqu'à maintenant.
Je sais que c'est très tard pour poster cela, mais voici un petit hack pour atteindre vos objectifs 😉
Simplement ajouter un mannequin vue ci-dessous votre viewpager:
Puis ajouter un
OnClickListener
à votreRelativeLayout
.Être un peu plus créatif avec les mises en page, leur placement et leur comportement, et vous allez apprendre à trouver un moyen de faire absolument tout ce que vous imaginez 🙂
Bonne chance!
setClickable
au lieu desetOnClickListener
, si vous n'avez pas besoin de géreronClick
événement.Essayez de remplacement et de retourner true soit à partir d' onInterceptTouchEvent() et/ou onTouchEvent(), qui consomment les événements tactiles sur le pager.
true
impliquer l'événement tactile a été traitée?J'ai utilisé cette classe avec succès. Substitution de la executeKeyEvent est nécessaire pour éviter de glisser à l'aide de flèches sur certains appareils, ou pour l'accessibilité:
Et dans le xml l'appeler comme ceci:
performClick()
méthode n'est pas surchargée.Dans kotlin, nous pouvons le résoudre par la création d'un widget personnalisé hériter de la ViewPager classe et l'ajout d'une valeur d'indicateur pour le contrôle de balayage comportement.
NoSwipePager.kt
En xml
Désactiver le balayage de la programmation. Si
kotlin-android-extensions
plugin est appliqué dans construire.gradle, le balayage peut être désactivé par l'écriture de code ci-dessous.Sinon on peut désactiver le balayage à l'aide du code ci-dessous:
onInterceptTouchEvent()
permettra d'éviter les vues enfant de recevoir des commentaires. Dans la plupart des cas, c'est pas le comportement voulu.super.onInterceptTouchEvent(event)
résultats de ces points de vue ne reçoit aucune entrée (qui est sur la documentation de l'objet deonInterceptTouchEvent
méthode).onInterceptTouchEvent()
méthode empêche (contenu) de la réception des avis.Dans Kotlin, ma solution, combinant les réponses ci-dessus.
onInterceptTouchEvent()
permettra d'éviter les vues enfant de recevoir des commentaires. Dans la plupart des cas, ce n'est pas le comportement voulu.Une autre solution simple pour désactiver le balayage à une page spécifique (dans cet exemple, la page 2):
Si vous écrivez une galerie d'images avec
ImageView
s etViewPager
, qui prend en charge le zoom et pan, voir une simple solution décrite ici: Mise en œuvre d'un zoom ImageView en Étendant la valeur par Défaut ViewPager dans Phimpme Android (et Github de l'échantillon - PhotoView). Cette solution ne fonctionne pas avecViewPager
seul.Si vous souhaitez appliquer les mêmes pour Android dans Xamarin, voici une traduction en C#
J'ai choisi de donner le nom de l'attribut "ScrollEnabled". Parce que iOS utilise juste le excat même nom. Donc, vous avez l'égalité de nommage sur les deux plates-formes, il est plus facile pour les développeurs.
Dans .axml fichier:
Aucun code ci-dessus fonctionne bien.j'ai essayé ce
voici ma mise en œuvre
si vous voulez désactiver l'animation de balayage vous pouvez-vous utiliser le swipeListener à gauche et à droite et vous souhaitez le défilement au doigt, mais sans animation
1-Remplacer
Viewpager
méthodeonInterceptTouchEvent
etonTouchEvent
2 - créez votre propre
GestureDetector
3 - détecter le mouvement de balayage et d'utiliser le
setCurrentItem(item, false)
ViewPager
le lorsque vous configurez le ViewPager définir la swipeListener
J'ai juste adapté les viewpager un peu et désactiver le glisser facilement.