web-dev-qa-db-fra.com

Afficher un PopupWindow centralisé

J'ai quelques popups sur mon application, c'est plein écran et le code suivant:

    content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int screenWidth = windowManager.getDefaultDisplay().getWidth();
    int screenHeight = windowManager.getDefaultDisplay().getHeight();
    int x = screenWidth / 2 - content.getMeasuredWidth() / 2;
    int y = screenHeight / 2 - content.getMeasuredHeight() / 2;
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y);

Centrez la fenêtre.

Mais j'ai une autre activité qui n'est pas en plein écran, lorsque la fenêtre contextuelle s'ouvre, elle est à droite de l'endroit où elle doit être.

En essayant de comprendre pourquoi cela se produit, je pense que showAtLocation montre que c'est par rapport à l'activité en cours, mais je dois le montrer par rapport à l'affichage.

Comment puis je faire ça? Ou y a-t-il un moyen plus simple de simplement centrer la fenêtre contextuelle?

42
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);

Cela centrera votre vue.

Il m'a fallu 2 heures de douleur pour comprendre cela. Je n'avais pas besoin de maths de magie noire pour gérer ça.

La vue n'est nécessaire que pour le jeton de fenêtre, elle n'a aucun autre impact sur l'emplacement.

Gravity indique au gestionnaire de disposition où commencer le système de coordonnées et comment traiter ces coordonnées. Je ne trouve pas les documents mais le piratage me montre que:

  • CENTER utilise le milieu de la fenêtre contextuelle pour être aligné sur les x, y spécifiés. 0,0 est donc centré sur l'écran
  • BOTTOM utilise le bas de la fenêtre contextuelle pour être aligné sur les x, y spécifiés. Donc 0,0 a le bas de la fenêtre contextuelle aligné avec le bas de l'écran. Si vous souhaitez un remplissage de 10 pixels, y = 10 (pas -10) pour déplacer la fenêtre contextuelle de 10 pixels vers l'écran.

J'ai écrit ceci ici Android PopupWindow.showAtLocation () et les effets de la gravité

106
Bae
        View popupView = layoutInflater.inflate(R.layout.index_popviewxml,
                null);


        final PopupWindow popupWindow = new PopupWindow(popupView,
                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true);



        popupWindow.setTouchable(true);
        popupWindow.setFocusable(true);

        popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
10
user3921752