2

LinearLayout があり、この LinearLayout は動的に配置されたビューを保持します。LinearLayout の子の幅を調べる必要がありますが、これは onCreate メソッドで行う必要があります。調査の結果、このメソッドから getWidth を使用できないことがわかりました。代わりに、onWindowFocusChanged を使用しています。これは、親 LinearLayout (実際のサイズを返す) に対して機能しますが、その子に対しては機能しません。

私が気付いたもう 1 つのことは、画面がフェードアウトして画面がロックされているときに、返される子の実際の幅をログで確認できることです (アクティビティが一時停止していると思います)。

子の幅に応じてこれらのビューを動的に配置する必要があるため、これが必要です。

4

3 に答える 3

5

以下で取得できる場合があります。しかし、他の人が指摘したように、これはおそらく良い考えではありません。

LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
LinearLayout.getMeasuredWidth();
于 2012-06-06T23:15:23.253 に答える
3

onCreate 内では、ビューは近くのビューや子などの状態をまだ知ることができないため、すべての準備が整い、レイアウト プロセスが完了して初めて、ビューのサイズを取得できます。

ビューが描画される直前にビューのサイズを取得するための簡単なコードを次に示します。

private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
    final ViewTreeObserver vto = view.getViewTreeObserver();
    final OnPreDrawListener preDrawListener = new OnPreDrawListener()
    {
        @Override
        public boolean onPreDraw()
        {
            Log.d(App.APPLICATION_TAG, CLASS_TAG + "onpredraw");
            runnable.run();
            final ViewTreeObserver vto = view.getViewTreeObserver();
            vto.removeOnPreDrawListener(this);
            return true;
        }
    };
    vto.addOnPreDrawListener(preDrawListener);
}

addOnGlobalLayoutListenerまたは、必要に応じて代わりに使用できますaddOnPreDrawListener

使用例:

runJustBeforeBeingDrawn(view,new Runnable()
{
  @Override
  public void run()
  {
    int width=view.getWidth();
    int height=view.getHeight();
  }
});

別のアプローチは onWindowFocusChanged を使用することです (そして hasFocus==true であることを確認します) が、それが常に最善の方法であるとは限りません (動的な作成ではなく、単純なビューの作成にのみ使用します)

編集: runJustBeforeBeingDrawn の代替: https://stackoverflow.com/a/28136027/878126

于 2012-06-06T23:03:21.253 に答える