web-dev-qa-db-ja.com

集中化されたPopupWindowを表示する

私のアプリにはいくつかのポップアップがあります。フルスクリーンで、次のコードです:

    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);

ウィンドウを中央に表示します。

しかし、フルスクリーンではない別のアクティビティがあります。ポップアップが開くと、必要な場所から右下に表示されます。

これが発生する理由を理解しようとすると、showAtLocationは現在のアクティビティに関連するものを示していると思いますが、ディスプレイに関連するものを表示する必要があります。

どうやってやるの?または、ポップアップをちょうど中央に置く簡単な方法がありますか?

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

これにより、ビューが中央に配置されます。

これを理解するのに2時間かかりました。これを処理するのに黒魔術は必要ありませんでした。

ビューはウィンドウトークンにのみ必要であり、他の場所には影響しません。

Gravityは、レイアウトマネージャーに座標系の開始位置とそれらの座標の処理方法を指示します。私はドキュメントを見つけることができませんが、ハッキングは私にそれを示しています:

  • CENTERは、ポップアップの中央を使用して、指定されたx、yに揃えます。したがって、0,0は画面中央に配置されます
  • BOTTOMはポップアップの下部を使用して、指定されたx、yに揃えます。したがって、0,0のポップアップの下部は画面の下部に揃えられます。 10pxのパディングが必要な場合は、y = 10(-10以外)でポップアップを画面上に10ピクセル移動します。

これをここに書きました Android PopupWindow.showAtLocation()およびGravityの効果

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