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