2011-08-16 24 views
2

我做了一個簡單的例子來解釋這個問題。下面是一個簡單的LinearLayout:如何在設置權重時獲取MeasureWidth()

<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()

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()); 

其中圖標是48x48dp的簡單圖像。問題是:爲什麼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()中創建一個對話框),再加上它不能被放置在生命週期的任何地方(請參考文檔) 但是,也找到了解決這個問題的方法。即通過在PreDrawListener上添加一個ViewTreeObserver。 – bediej

相關問題