1. ホーム
  2. android

レイアウトの高さと幅をプログラムで取得する

2023-08-23 01:26:29

質問

私は、以下のようなレイアウトを設計しました。 LinearLayout には2つの子 LinearLayoutFrameLayout で、それぞれの子には異なるビューを配置します。

の高さと幅を測定したかっただけです。 FrameLayout を測定したかっただけです。

私が使っているプログラムでは

int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();

は値を 0 となります。

以下のコードで試してみました。 int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();

は同じ値を返す 0

で、最後に以下のコードで試してみました。 int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;

は私を返します -2-1

任意のレイアウトの高さと幅をプログラム的に取得するソリューションが欲しいのですが?

どのように解決するのですか?

ビュー自体は、基本的に以下のような独自のライフサイクルを持っています。

  • アタッチされる

  • 測定値

  • レイアウト

  • 描画

例えば、onCreateメソッドで実行する場合、その時点ではビューの計測が行われていない可能性があります。一方、ボタンのonClickメソッドで実行する場合、その時点でビューのアタッチ、計測、レイアウト、および描画が行われている可能性があるので、期待通りの値を確認することができますが、正しいタイミングで値を取得していることを確認するためにViewTreeObserverを実装すべきです。

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUR VIEW ID);
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } 
        int width  = layout.getMeasuredWidth();
        int height = layout.getMeasuredHeight(); 

    } 
});