J'ai une PopupWindow sur mon activité, le fait est que ma PopupWindow s'affiche toujours même lorsque j'interagis avec mon activité (disons faire défiler ma liste). Je peux faire défiler ma liste et la fenêtre PopupWindow est toujours là.
Ce que je veux réaliser, c'est lorsque je touche / défile / clique sur / etc sur l'écran qui n'est pas la PopupWindow, je veux fermer la PopupWindow. Tout comme le fonctionnement d'un menu. Si vous avez cliqué en dehors du menu, le menu sera fermé.
J'ai essayé setOutsideTouchable(true)
mais cela ne fermera pas la fenêtre. Merci.
android
popupwindow
android-menu
villageois
la source
la source
BitmapDrawable()
est obsolète. UtilisezColorDrawable()
plutôt.J'ai trouvé qu'aucune des réponses fournies ne fonctionnait pour moi, à l'exception du commentaire de WareNinja sur la réponse acceptée, et celui de Marcin S. fonctionnera probablement également. Voici la partie qui fonctionne pour moi:
Alternativement:
Je ne sais pas quelles sont les différences, mais le code source de ListPopupWindow utilise en réalité ce dernier lorsque sa modalité est définie sur true avec setModal, donc au moins les développeurs Android considèrent cette approche viable, et ce n'est qu'une ligne.
la source
setFocusable
, nous devons cliquer deux fois sur le bouton (où le bouton est placé en dehors de la fenêtre contextuelle) où, comme dans la 1ère méthode, cela fonctionne bien :)BitmapDrawable()
est déprécié. UtilisezColorDrawable()
plutôt.J'ai rencontré les mêmes problèmes et je l'ai corrigé comme ci-dessous. Ça fonctionne bien pour moi.
BTW, n'utilisez pas le constructeur obsolète BitmapDrawable, utilisez ce nouveau ColorDrawable (android.R.color.transparent) pour remplacer l'arrière-plan par défaut.
S'amuser@.@
la source
Je sais qu'il est tard mais je remarque que les gens ont toujours un problème avec la fenêtre contextuelle. J'ai décidé d'écrire un exemple entièrement fonctionnel où vous pouvez fermer la fenêtre contextuelle en touchant ou en cliquant à l'extérieur de celle-ci ou en touchant simplement la fenêtre elle-même. Pour ce faire, créez une nouvelle classe PopupWindow et copiez ce code:
PopupWindow.class
Créez maintenant la mise en page de la fenêtre contextuelle: popup.xml
Dans votre activité principale, créez une instance de la classe PopupWindow:
où YOUR_MAIN_LAYOUT est la disposition de l'activité actuelle dans laquelle popupWindow apparaîtra
la source
Merci pour la réponse de @ LunaKong et la confirmation de @ HourGlass. Je ne veux pas faire de commentaire en double, mais je veux seulement le rendre clair et concis.
Mttdat.
la source
Pour un
ListPopupWindow
ensemble, la fenêtre doit être modale lorsqu'elle est affichée.De cette façon, cliquer en dehors de la
ListPopupWindow
fera disparaître.la source
mListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
empêcher la fenêtre contextuelle d'interférer avec le clavier à l'écran.Notez que pour annuler avec
popupWindow.setOutsideTouchable(true)
, vous devez définir la largeur et la hauteurwrap_content
comme le code ci-dessous:la source
Il supprimera la fenêtre contextuelle lorsque vous cliquez / touchez sur l'écran.Assurez-vous que vous avez défini focusable true avant showAtLocation.
la source
Vous pouvez utiliser
isOutsideTouchable
OUisFocusable
pour afficher la fenêtre contextuelle lorsque vous touchez à l'extérieurRemarque
Actuellement, après le test, je vois que
setBackgroundDrawable
cela ne nous aide pas à fermer la fenêtre contextuelleSi vous regardez le code pour ignorer dans
PopupWindow
(PopupWindow->PopupDecorView->dispatchKeyEvent
etPopupWindow->PopupDecorView->onTouchEvent
). Vous verrez que lorsque le bouton de retour de la presse, ils écartent surACTION_UP
et en dehors en contact qu'ils rejettent surACTION_UP
ouACTION_OUTSIDE
la source
la source
Les suggestions de @LunaKong fonctionnent comme un charme.
Mais la configuration de mPopupWindow.setFocusable (false). supprime le toucher inutile nécessaire pour faire disparaître la fenêtre contextuelle.
Par exemple: considérons qu'une fenêtre contextuelle est visible à l'écran et que vous êtes sur le point de cliquer sur un bouton. Donc, dans ce cas, (si mpopwindow.setFocusable (true)) au premier clic d'un bouton, popupwindow se fermera. Mais vous devez cliquer à nouveau pour que le bouton fonctionne. if ** (mpopwindwo.setFocusable (false) ** un simple clic sur le bouton ferme la fenêtre contextuelle et déclenche le clic du bouton. J'espère que cela aide.
la source
Définissez l'arrière-plan de la fenêtre transparent:
Après avoir défini votre arrière-plan dans la mise en page. Fonctionne très bien.
la source
Dans certains cas, il n'est pas souhaitable de rendre le popup focusable (par exemple, vous ne voudrez peut-être pas qu'il vole le focus d'une autre vue).
Une autre approche consiste à utiliser un intercepteur tactile:
la source
Si cette fenêtre contextuelle est une autre activité, et que vous avez réduit sa taille à l'écran d'origine et que vous souhaitez activer ou désactiver la zone extérieure, vous pouvez simplement activer ou désactiver la zone extérieure à l'aide de ce code:
activer:
YourActivity.this.setFinishOnTouchOutside(true);
désactiver:
YourActivity.this.setFinishOnTouchOutside(false);
la source
Utilisez View popupView pour fermer la fenêtre popup
`Si vous utilisez ceci, vous pouvez également définirOnClickListener sur n'importe quel bouton dans la fenêtre contextuelle
la source