Lorsque je montre un fragment (qui est en plein écran avec un #77000000
arrière-plan) sur un autre fragment (appelons-le principal), mon fragment principal réagit toujours aux clics (nous pouvons cliquer sur un bouton même si nous ne le voyons pas).
Question : comment empêcher les clics sur le premier fragment (principal)?
ÉDITER
Malheureusement, je ne peux pas simplement cacher le fragment principal, car j'utilise un arrière-plan transparent sur le deuxième fragment (afin que l'utilisateur puisse voir ce qui se trouve derrière).
android
android-fragments
Dmitry Zaytsev
la source
la source
Visibility
votremain
Fragment
àGONE
quand vous ne l' utilisez pas.onClick
méthode ne renvoie rien. Mais vous donnez une idée, merci (je posterai bientôt une réponse).Réponses:
Définissez la
clickable
propriété true sur la vue du deuxième fragment. La vue capturera l'événement afin qu'il ne soit pas transmis au fragment principal. Donc, si la vue du deuxième fragment est une mise en page, ce serait le code:la source
RelativeLayout
à l'intérieur du fragment, et j'ai mis toute la vue avec laclickeable
propriété. La solution de @Dmitry résout mon problème.La solution est assez simple. Dans notre deuxième fragment (qui chevauche notre fragment principal), nous avons juste besoin d'attraper l'
onTouch
événement:la source
Ajoutez simplement
clickable="true"
etfocusable="true"
à la disposition parentSi vous utilisez
AndroidX
, essayez cecila source
focuseable
n'est pas vraiment nécessaire.focusable="true"
c'est juste pour éviter un avertissement dans Android Studio.Vous devez masquer le premier fragment lorsque vous affichez le deuxième fragment si deux fragments sont placés dans la même vue de conteneur.
la source
Vous devez ajouter
android:focusable="true"
avecandroid:clickable="true"
Clickable
signifie qu'il peut être cliqué par un périphérique pointeur ou être tapé par un périphérique tactile.Focusable
signifie qu'il peut obtenir le focus d'un périphérique d'entrée comme un clavier. Les périphériques d'entrée tels que les claviers ne peuvent pas décider à quelle vue envoyer ses événements d'entrée en fonction des entrées elles-mêmes, ils les envoient donc à la vue qui a le focus.la source
Il y a plus d'une solution que certains d'entre nous ont contribué à ce fil, mais je voudrais également mentionner une autre solution. Si vous n'avez pas envie de mettre clickable et focusable égal à true pour le ViewGroup racine de chaque mise en page en XML comme moi. Vous pouvez également le mettre à votre base si vous en avez un comme ci-dessous;
J'espère que cela aide ceux qui détestent les XML de mise en page.
la source
La réponse acceptable "fonctionnera", mais entraînera également un coût de performance (sur-dimensionnement, nouvelle mesure en cas de changement d'orientation), car le fragment en bas est toujours en cours d'élaboration. Peut-être que vous devriez simplement trouver le fragment par étiquette ou ID et définir la visibilité sur GONE ou VISIBLE lorsque vous devez à nouveau afficher.
À Kotlin:
Cette solution est préférable à l'alternative
hide()
et auxshow()
méthodesFragmentTransaction
lorsque vous utilisez des animations. Vous l'appelez simplement à partir duonTransitionStart()
etonTransitionEnd()
duTransition.TransitionListener
.la source
Metod 1:
Vous pouvez ajouter à la disposition de tous les fragments
Metod 2: (par programme)
Étendez tous les fragments de
FragmentBase
etc. Ajoutez ensuite ce code àFragmentBase
la source
Ce que vous pouvez faire, c'est que vous pouvez donner un clic vide à la disposition du fragment précédent en utilisant la propriété onClick pour la disposition parent de ce fragment principal et en activité, vous pouvez créer une fonction
doNothing(View view)
et n'y écrire rien. Cela le fera pour vous.la source
Cela ressemble à un cas pour DialogFragment. Sinon, avec Fragment Manager, validez l'un pour masquer et l'autre pour afficher. Cela a fonctionné pour moi.
la source
L'ajout de
android:clickable="true"
n'a pas fonctionné pour moi. Cette solution ne fonctionne pas sur CoordinatorLayout lorsqu'il s'agit d'une disposition parent. C'est pourquoi j'ai fait RelativeLayout en tant que disposition parent, y ai ajoutéandroid:clickable="true"
et placé CoordinatorLayout sur ce RelativeLayout.la source
J'ai eu plusieurs fragments avec le même xml.
Après avoir passé des heures, j'ai supprimé
setPageTransformer
et ça a commencé à fonctionnerJ'avais une logique effrayante.
la source