Android Nougat PopupWindow showAsDropDown (…) La gravité ne fonctionne pas

J'ai ce code.

PopupWindow popUp = new PopupWindow(); popUp.setFocusable(true); popUp.setOutsideTouchable(true); popUp.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); popUp.setHeight(600); popUp.setContentView(anchorView); popUp.showAsDropDown(anchorView); popUp.update(); 

Et il fonctionne parfaitement sur la version Android <Android Nougat. Mais dans Android Nougat, le popup est affiché en haut de l'écran plutôt que par rapport à la vue d'ancrage.

  • Une classe DialogFragment interne doit-elle être statique ou non?
  • Arrêter le gestionnaire après que le segment a été détruit
  • OBD2 - ELM327 simulateur bluetooth
  • Erreur étrange depuis la mise à niveau vers Android 4.2.2 - L'activité a été filtrée IntentReceiver
  • Comment simuler la rotation de l'appareil avec un émulateur Android?
  • Chargement de toutes les images de la galerie dans l'application dans Android
  • La recherche par ordinateur ne fonctionne pas
  • Comment identifier quel fichier MP3 s'est terminé dans MediaPlayer.OnCompletionListener?
  • Android - Créer des SMS à partir de l'API PDU obsolète?
  • Barre d'outils et ActionBar Contextuelle avec AppCompat-v7
  • Comment obtenir un utilisateur en ligne ou hors ligne dans asmack, android
  • Quel est le bon moyen de désenregistrer les rappels du cycle de vie des activités?
  • 4 Solutions collect form web for “Android Nougat PopupWindow showAsDropDown (…) La gravité ne fonctionne pas”

    Il semble qu'un bug dans Android 7.0. Mais vous pouvez le résoudre de manière compatible.

     PopupWindow popUp = new PopupWindow(); popUp.setFocusable(true); popUp.setOutsideTouchable(true); popUp.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); popUp.setHeight(600); popUp.setContentView(anchorView); if (android.os.Build.VERSION.SDK_INT >=24) { int[] a = new int[]; anchorView.getLocationInWindow(a); popUp.showAtLocation(((Activity) mContext).getWindow().getDecorView(), Gravity.NO_GRAVITY, 0 , a[1]+anchorView.getHeight()); } else{ popUp.showAsDropDown(anchorView); } popUp.update(); 

    Google réparera ce bug dans la construction future. Et il y a une solution finale. Vous devez donner la hauteur lors de la création de la pop.

    PopupWindow popup = new PopupWindow (contentView, avec, hauteur);

    Init pop comme ci-dessus, et vous ne pouvez utiliser que popUp.showAsDropDown (anchorView) pour afficher cette fenêtre contextuelle. De cette façon, vous pouvez ignorer la version d'Android api.

    On dirait que ce problème apparaît uniquement dans Android 7.0 (API 24). Dans 7.1.1 (API 25), tout est correct sur les mêmes appareils. Après quelques recherches définies que le problème causé par popUp.update() , comme il l'a déjà mentionné par Marilia . Mais si vous supprimez popUp.update() , le popup n'apparaîtra pas dans les versions antérieures à l'API 24. Pour éviter cela, la seule façon d'utiliser maintenant la vérification de la version et ne pas utiliser la méthode update() uniquement sur les périphériques Avec l'API 24. Voici la solution qui a fonctionné pour moi:

     if (Build.VERSION.SDK_INT != 24) { popup.update(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); } 

    L'a testé sur différents périphériques et API et fonctionne bien partout dans API 18 et jusqu'à l'API 25.

    7.0 et 7.1 pour atteindre différents, afin d'être traités séparément.

    La méthode suivante que j'ai testée dans la machine virtuelle (7.0 et 7.1), sans problème.

     public void showFilterWindow(Context context, PopupWindow popupWindow,View showView, int xoff, int yoff) { if (Build.VERSION.SDK_INT < 24) { //7.0 The following system is used normally popupWindow.showAsDropDown(showView, xoff, yoff); } else { int[] location = new int[2]; showView.getLocationOnScreen(location); int offsetY = location[1] + showView.getHeight(); if (Build.VERSION.SDK_INT == 25) { //【note!】Gets the screen height without the virtual key WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int screenHeight = wm.getDefaultDisplay().getHeight(); /* * PopupWindow height for match_parent, * will occupy the entire screen, it needs to do special treatment in Android 7.1 */ popupWindow.setHeight(screenHeight - offsetY); } //Use showAtLocation to display pop-up windows popupWindow.showAtLocation(showView, Gravity.NO_GRAVITY, 0, offsetY); } } 

    Avez-vous vraiment besoin de ce popUp.update(); Dans votre code? J'avais un problème similaire, dans mon cas, je n'avais pas besoin de popUp.update(); Et l'enlever, la gravité par popup se comporte comme prévu.

    De plus, il s'agit probablement d'un problème connexe, signalé sur PopupWindow.showAtLocation() :

    https://code.google.com/p/android/issues/detail?id=221001

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.