2

ビューの高さと幅、特にこのスレッドを取得する際に人々が抱えている問題に対するさまざまな質問と回答をたくさん見てきました。

以下は、ビュー ディメンションを取得する方法として言及されています。

  1. アクティビティの onWindowFocusChanged()
  2. 使用しているビューのタイプをサブクラス化し、onSizeChanged()、onLayout()、または onMeasure() のいずれかをオーバーライドします
  3. ViewTreeObserver と addOnGlobalLayoutListener() の使用

それぞれが機能しているように見える場合もあれば、何かが正しく機能しないと言う人もいます。View クラスには setOnDimensionsKnown(OnDimensionsKnown odk) または同様のメソッドがないため、これらのメソッドのどれ (またはおそらく言及されていないメソッド) が、ビューがまだ描画されているかどうかに関係なく、wrap_content またはfill_parent パラメータ、または明示的な高さと幅が px、dp などで設定されていますか?

編集:おそらく特定の例が役立つでしょう。PopupWindow でコンテンツをラップし、幅の値だけ -x 方向にオフセットしようとしています。問題は、コンテンツの幅、つまり popupwindows の幅が、ポップアップを表示するまで測定されないことです。したがって、基本的に、画面に描画される前の幅を測定する良い方法は考えられません。

私の通常のアプローチは、描画する前に寸法が必要なビュー クラスをオーバーライドし、独自の setOnDimensionsKnown(OnDimensionsKnown odk) メソッドを作成し、onMeasure が呼び出される幅と高さの値で起動することです。これは、必要なすべてのケースで機能しますが、これを行うためにすべてのビュー クラスをオーバーライドするのはあまりエレガントではないようです。

例をさらに説明するのに役立つコードを投稿できます。

4

1 に答える 1

0

この回答OnGlobalLayoutListener()に記載されているように、ビューに を追加することをお勧めします (私の意見では、これが最も信頼できると思います)。私が a に対して行う方法は、レイアウトを膨らませてから呼び出すことです。ViewPopupWindowmeasure

popupView = getActivity().getLayoutInflater().inflate(R.layout.popup_layout, null);
popup = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
popupView.measure(view.getMeasuredWidth(), view.getMeasuredHeight()); //the view is parent's layout (not sure if those are correct values, but it measures okay in my case)

そして、 and を呼び出して番号を取得するだけpopupView.getMeasuredHeight()です.getMeasuredWitdh()

あなたの問題はおそらくもうとっくに解消されていますが、他の誰かがこれに出くわして役立つことを願っています. :)

于 2015-04-21T09:48:14.970 に答える