2016-02-22 77 views
-1

即時創建在C#Xamarin/Android的一個自定義的控制的Android定製控制XML ID參考

它需要有其在兒童的XML佈局設置的2的基準,所以我嘗試此。

<declare-styleable name="CustomControl"> 
    <attr name="firstViewReference" format="reference" /> 
    <attr name="SecondViewReference" format="reference" /> 
    </declare-styleable> 

然後在代碼IM這樣做是爲了獲取值:

TypedArray a = this.Context.ObtainStyledAttributes(this.xmlAttrs, Resource.Styleable.CustomControl); 
    int aid =a.GetResourceId(Resource.Styleable.CustomControl_firstViewReference,0); 

但調用getResourceId總是返回錯誤值(0這裏)。

我的XML:

<CustomControl xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:local="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     local:firstViewReference="@+id/firstView"> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@id/firstView"/> 
    </CustomControl> 

有什麼錯嗎?爲什麼我沒有得到我的視圖設置爲firstViewReference的ID?

在此先感謝。

+0

什麼是'this.xmlAttrs'?發佈更多的代碼,因爲它不清楚你在哪裏使用'ObtainStyledAttributes' – pskink

回答

0

此代碼:

TypedArray a = this.Context.ObtainStyledAttributes(this.xmlAttrs, Resource.Styleable.CustomControl); 
    int aid =a.GetResourceId(Resource.Styleable.CustomControl_firstViewReference,0); 

在OnFinishInflate,因爲我認爲需要,所以我不得不等待,直到它完成充氣訪問其孩子的。

我把這段代碼放在視圖構造函數中,現在它返回正確的id。

當然,我需要在OnFinishInflate中調用findViewById,否則它將返回null。

解決的辦法是在構造函數上創建TypedArray而不是OnFinishInflate,有人能指出爲什麼需要這樣嗎? this.xmlAttrs是在構造函數中接收的AttributeSet。

+1

這是因爲'LayoutInflater'在膨脹所有視圖時共享相同的'AttributeSet' – pskink

+0

所以我只能在它開始解析下一個元素之前獲取屬性?不應該在文檔? – Nanoc

+0

是的,應該是,但你知道......他們會這樣做「mañana」 – pskink