2011-08-16 19 views
2

私は問題を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が行うすべてを計算しようとする可能性がありますが、より洗練されたソリューションがあるかもしれません。

答えて

2

onCreateは、アクティビティが表示されるよりもずっと前に呼び出されます。

したがって、iv1.getMeasuredWidth()は、期待する値ではなく、後で別のメソッドで呼び出す必要があります。私はonWindowFocusChangeが正しいと思います。

+0

これはかなり混乱しています。 LinearLayoutのすべての子に対してmeasure()を呼び出して正しい結果を返したら、結果を得るために別のメソッド(onWindowFocusChangeなど)が呼び出されるのを待たなければならないのはなぜですか。私は、LinearLayoutの子を持っているときに、いつもこの値(実際の幅/高さ)にアクセス可能でなければなりません。 – bediej

+0

はい、しかしいいえ。サイズは画面のサイズや向きの変更、および他のコンポーネントのサイズの変更によって変化します。 – njzk2

+1

大丈夫、私はいくつかの簡単なテストを行い、onWindowFocusChangeが動作するように見えます(実際には幅は160と呼ばれます)。問題は、このメソッドは呼び出されることが保証されていません(あなたのアクティビティは実際にonCreate()でダイアログを作成しています)、ライフサイクルのどこにでも配置することはできません(ドキュメントを参照してください) この問題の回避策も見つかりました。つまり、ViewTreeObserver onPreDrawListenerを追加します。 – bediej

関連する問題