web-dev-qa-db-ja.com

特別な場所でPopupWindowを表示する方法は?

画面に表示されるPopupWindowの下にViewsを表示する必要があります。

必要なViewの座標を計算し、その下にPopupWindowを配置するにはどうすればよいですか?コード例は大歓迎です。ありがとう。

27
Eugene

すでに表示されているビューを見つけるのは非常に簡単です-私のコードで使用するものは次のとおりです:

public static Rect locateView(View v)
{
    int[] loc_int = new int[2];
    if (v == null) return null;
    try
    {
        v.getLocationOnScreen(loc_int);
    } catch (NullPointerException npe)
    {
        //Happens when the view doesn't exist on screen anymore.
        return null;
    }
    Rect location = new Rect();
    location.left = loc_int[0];
    location.top = loc_int[1];
    location.right = location.left + v.getWidth();
    location.bottom = location.top + v.getHeight();
    return location;
}

それから、Ernestaが提案したものに似たコードを使用して、ポップアップを関連する場所に貼り付けることができます。

popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom);

これにより、元のビューのすぐ下にポップアップが表示されますが、ビューを表示するのに十分なスペースがあるという保証はありません。

104
zeetoobiker

getLeft()getBottom()を使用して、レイアウト内のビューの正確な位置を取得します。ビューが占める正確なスペースを知るために、getWidth()getHeight()もあります。ポップアップウィンドウをビューの下に配置する場合。

ビューのsetLeft()およびsetTop()メソッドを使用して、新しいポップアップウィンドウを配置します。

7
Yashwanth Kumar

タイトルや通知バーなどを使用せずにメインアプリケーション画面のサイズを取得するには、問題の画面を生成するクラスで次のメソッドをオーバーライドします(サイズはピクセル単位で測定されます)。

_@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
}
_

ポップアップを表示するビューの下部座標を取得するには:

_View upperView = ...
int coordinate = upperView.getBottom();
_

これで、_height - coordinate_がポップアップビューに十分な大きさである限り、次のようにポップアップを配置できます。

_PopupWindow popup = new PopupWindow();

Button button = new Button(this);
button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        popup.showAtLocation(parent, Gravity.CENTER, 0, coordinate);
    }
});
_

ここで、showAtLocation()は、重力および位置オフセットとともに引数として親ビューを取ります。

2
ernes7a