Android已經幫開發者撰寫了許多好用的layout、widget,

像是ListView、TablyLayout、TextView、TabHost...族繁不及備載。

 

但如果現在我需要增加一些新的功能,在原生的Widget上,

通常我們會使用繼承,先繼承基本的類別,再加以改進新增我們需要的method。

 

舉例來說,我使用了 TableLayout 來做為我的 Layout,

可是 TableLayout 沒有像 ListView.notifyChanged() 那樣即時更新的功能,

所以我必須要自己撰寫。

 

這時候我會寫一個 RenewableTableLayout 去繼承 TableLayout,

然後再加上我自己需要的 method。

 

也可以說,我為自己的需求,客製化(Customized View)了一個 TablyLayout。

像是這樣:

customeView  

我也想要我自己撰寫的 RenewableTablyLayout 可以用在XML裡頭,

其實很簡單,我今天花了一個下午的時間,為了一個關鍵性的問題。

 

TableLayout 本身預設了兩個 constructor,

其中之一只需要參數 Context ,另外一個則需要 Context 與 AttributeSet,

AttributeSet代表由XML檔傳入的相關參數設定,例如layout_width、layout_gravity等等。

 

所以如果想要在XML檔裡頭使用我自己定義的View,必須要有帶 AttributeSet 參數的constructor。

 

然後我就可以像是使用一般Widget一樣的,在XML裡頭使用我自己改寫好的View,像是:

customeView_2  

我今天琢磨了一個下午的難題,就是因為我 implement 了

只帶 Context 參數的 Constructor,

所以當XML檔想要傳入 AttributeSet 的時候,

就會發生 Inflate layout failed 的 exception。

 

這一點是在自己客製化 View 的時候,容易忽略的。

 

arrow
arrow
    全站熱搜

    keep walking 發表在 痞客邦 留言(0) 人氣()