Viewの大きさの取得

ビューの大きさを計ろうとしてonCreateメソッド内で次のようなコードを書くと幅や高さが0という結果が返ってきます。

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    Button button = findViewById(R.id.button);
    Log.d("MainActivity : ", "ボタン幅 = " + button.getWidth());
    Log.d("MainActivity : ", "ボタン高さ = " + button.getHeight());
}

onStratやonResumeメソッド内でこれと同じ方法で取得しようとしても同じように0が返ってきます。

なぜ0が返ってくるかというと、ビューがアクティビティに設置される前に大きさを取得しようとしているからです。

解決策

そこでビューが設置されたあとにビューの幅や高さを取得するには次のようにViewTreeObserverを使います。

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        final Button button = (Button)findViewById(R.id.button);
        ViewTreeObserver observer = button.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(
        new ViewTreeObserver.OnGlobalLayoutListener() 
        {
            @Override
            public void onGlobalLayout() 
            {
                Log.d("MainActivity : ", "ボタン幅 = " + button.getWidth());
                Log.d("MainActivity : ", "ボタン高さ = " + button.getHeight());
            }
        });
    }
}

大きさを計りたいビューにGlobalLayoutListenerを実装するだけです。

ビューの設置が完了した時点でのonGlobalLayoutメソッドが呼ばれるのでそこでビューの正しい大きさを取得することが可能です。

関連項目
プライバシーポリシー