2010-01-13 262 views
9

我已經創建了一個延伸的景觀類:getLayoutParams返回null?

public class BoardView extends View { 

和我指定的BoardView的寬度和高度,在應用程序的main.xml中的文件:

<mypackage.BoardView 
     android:id="@+id/board"   
     android:layout_width="270px" 
     android:layout_height="270px" /> 

我試圖從一個從BoardView的構造函數調用的函數中獲取寬度和高度。以下是我在做什麼:

ViewGroup.LayoutParams p = this.getLayoutParams(); 
int h = p.height; 

但getLayoutParams始終返回null。任何想法爲什麼這不起作用?

回答

13

我不確定佈局參數(即LayoutParams的實例)在視圖的構造函數中是否可用。我想,它只會在「佈局」通過後纔可用。閱讀關於How Android draws views here.此外,this thread試圖指出什麼時候你應該期望得到一個視圖的度量尺寸。

請注意,如果您只想獲取通過layout XML傳遞的屬性值,則可以使用AttributeSet實例作爲參數傳遞給您的構造函數。

public MyView(Context context, AttributeSet attrs){ 
// attrs.getAttributeCount(); 
// attrs.getAttributeXXXvalue(); 
} 
+2

感謝您的幫助。 我真正需要的是我可以從構造函數中的AttributeSet中獲取的XML屬性值。這是我的(醜)解決方案: String ns =「http://schemas.android.com/apk/res/android」; String v = attrs.getAttributeValue(ns,「layout_height」); //將「270px」轉換爲「270」 v = v.replace(「px」,「」); //在運行時,該值爲「270.0」 v = v.replace(「。0」,「」); int h = Integer.parseInt(v); – tronman 2010-01-14 19:54:54

14

將視圖添加到其父項後,可以使用佈局參數。嘗試將代碼從視圖構造函數移動到onAttachedToWindow(),因爲getLayoutParams()在那裏不會返回null

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    assert getLayoutParams() != null; 
}