2013-05-29 227 views
1

有誰知道,如何獲得一個引用的xml佈局,以編程方式(在代碼中)爲我的自定義小部件。我已經創建了一個自定義的聲明樣式,使用我想要的屬性,並且我知道如何獲取ohter xml屬性值,比如字符串或整數。自定義視圖與自定義xml屬性:如何重新佈局

我想要做的是這樣的:

<MyCustomView 
    xmlns:my="http://schemas.android.com/apk/res-auto" 
    id="@+id/view" 
    my:headerLayout="@layout/my_fancy_layout" 
    /> 

所以我想以編程方式檢索my_fancy_layout和MyCustomView的代碼是充氣佈局。

任何想法如何做到這一點?

編輯:我想我可以用

int resId = attrs.getAttributeResourceValue(androidns, "headerLayout", 0);

但什麼retreive資源ID正確的命名空間,如果我MyCustomView是庫項目,如果我想用

的xmlns :my =「http://schemas.android.com/apk/res-auto」

回答

0

好吧,我找到了解決辦法由自己:

你必須檢索YOUT的AttributeSet一個TypedArray。

比你可以用這樣的訪問所需資源ID:

TypedArray attrs = ... ; 
int headerRes = attrs.getResourceId(R.styleable.MyCustomWidget_headerLayout, -1); 

比你可以擡高像平時:

LayoutInflater.from(context).inflate(headerRes, this); 
0

你的確可以膨脹你的佈局在constru您的自定義視圖的構造函數:

public class MyCustomView extends /* LinearLayout, RelativeLayout, etc. */ { 
    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(context, attrs); 
    } 
    public MyCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initView(context, attrs); 
    } 
    protected void initView(Context context, attrs) { 
     LayoutInflater.from(context).inflate(attrs.getAttributeResourceValue("http://schemas.android.com/apk/res-auto", "headerLayout", 0), this, true); 
    } 
} 
+0

啊,這是明確的,但我想指定佈局XML。所以我想用在xml – sockeqwe

+0

中指定的值替換R.layout.my_custom_view的值,我只是編輯了我的答案以反映這一點。雖然沒有測試過。 – etienne