私は問題をilustrateする簡単な例を作成しました。ここでは簡単なのLinearLayoutです:ウェイトが設定されているときにgetMeasuredWidth()を取得する方法
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>
、その後、私は()のonCreateでそれを移入
アイコンが48x48dpのシンプルなイメージであるprivate final String TAG = getClass().getSimpleName();
ImageView iv1;
ImageView iv2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout container = (LinearLayout) findViewById(R.id.ll);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.weight=1.0f;
iv1 = new ImageView(this);
iv1.setImageResource(R.drawable.icon);
iv2 = new ImageView(this);
iv2.setImageResource(R.drawable.icon);
container.addView(iv1, lp);
container.addView(iv2, lp);
container.measure(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
Log.d(TAG, " measured width(1): " + iv1.getMeasuredWidth());
Log.d(TAG, " measured width(2): " + iv2.getMeasuredWidth());
。質問は、なぜgetMeasuredWidthがLogsで48を返すのですか?しかし、階層ビューアを見ると、mMeasureWidthは160ですか?言い換えれば、実際の質問は.. LinearLayoutで伸ばされたときに、ビューの実際の幅/高さ(Javaで)をどうやって取得できますか? requestLayout()を呼び出すと、measure()は機能しません。私は、体重の合計を取得し、LinearLayoutが行うすべてを計算しようとする可能性がありますが、より洗練されたソリューションがあるかもしれません。
これはかなり混乱しています。 LinearLayoutのすべての子に対してmeasure()を呼び出して正しい結果を返したら、結果を得るために別のメソッド(onWindowFocusChangeなど)が呼び出されるのを待たなければならないのはなぜですか。私は、LinearLayoutの子を持っているときに、いつもこの値(実際の幅/高さ)にアクセス可能でなければなりません。 – bediej
はい、しかしいいえ。サイズは画面のサイズや向きの変更、および他のコンポーネントのサイズの変更によって変化します。 – njzk2
大丈夫、私はいくつかの簡単なテストを行い、onWindowFocusChangeが動作するように見えます(実際には幅は160と呼ばれます)。問題は、このメソッドは呼び出されることが保証されていません(あなたのアクティビティは実際にonCreate()でダイアログを作成しています)、ライフサイクルのどこにでも配置することはできません(ドキュメントを参照してください) この問題の回避策も見つかりました。つまり、ViewTreeObserver onPreDrawListenerを追加します。 – bediej