Android自定義控制項(2)

2021-09-22 05:10:56 字數 3914 閱讀 5380

1、設定自定義控制項:android自帶的radiobutton只能存放text,這不符合我們的需求,我們需要乙個可以同時存放key-value對應的鍵值。所以我們要編寫乙個自定義控制項能存放key-value。

設計思路:新建乙個類叫org.kandy.view.radiobutton,繼承自android.wedget.radiobutton,重寫父類 的所有構造方法。這樣我們就實現了乙個跟父類一摸一樣的控制項。在此基礎上加入我們需要的功能:加入乙個屬性value,用來存放radiobutton的 key。

**如下:

public class radiobutton extends android.widget.radiobutton   

public string getvalue()   

public void setvalue(string value)   

public radiobutton(context context, attributeset attrs)  catch (exception e)   

}  public radiobutton(context context)   

}  紅色**可以先不看。先看我們新加入的屬性value,由於android習慣屬性命名以m開頭。所以我們自定義控制項就按照這個規則來寫。不過對於 setter、getter方法來說,不需要加入m。像上面的:屬性名稱 mvalue,setter:setvalue(),getter:getvalue()。當然,你也可以不按照android的習慣來命名。

這樣,我們就可以使用這個自定義控制項了。而且可以給它設定乙個value,加上父類的text屬性。我們就可以在radiobutton中加入key- value的鍵值了。當然,這裡面的key對應是控制項的value屬性,value是對應控制項的text屬性。完了?沒有。自定義控制項才剛開始了。

2、xml中引用自定義控制項

在xml中加入自定義控制項其實很簡單。只需要在控制項名字前加入包名即可。如下:

<

org.kandy.view.radiobutton

android:id

="@id/ispaydeposittrue"

fsms:value

="true"

android:layout_width

="wrap_content"

android:layout_height

="wrap_content"

android:text

="@string/yes"

android:textsize

="18sp"

>

org.kandy.view.radiobutton

>

同樣,紅色部分可以先不看,也不需要加入到**中,這個時候加入會報錯,請注意。

3、attrs.xml屬性定義。

在我們的思想中,既然我在自定義控制項中加入了乙個新的屬性,那麼我就應該能夠在xml中引用它,並對它賦初始值。我當初也是這樣想的。可是卻無從下手。就是這一點,折騰了我乙個下午。

正解:res/values/attrs.xml中定義屬性,在自定義控制項中獲取這個屬性,然後跟自定義控制項的屬性相繫結。

attrs.xml如果沒有,就新建乙個。這裡只存放自定義控制項中需要的屬性,在我看來,這個檔案是乙個中介,負責將layout/xx.xml裡面的對這個變數的引用和自定義控制項裡面的屬性繫結起來。

attrs.xml完整**如下:

<?

xmlversion

="1.0"

encoding

="utf-8"

?>

<

resources

>

<

declare-styleable

name

="radiobutton"

>

>

<

attr

name

="value"

format

="string"

/>

>

declare-styleable

>

resources

>

如果res下沒有錯誤的話,在r中應該就會生成這些資源的id。這樣我們就能在自定義控制項中引用他們。

這裡我們可能對format不是很熟悉,目前android系統內建的格式型別有integer比如progressbar的進度值,float比如 ratingbar的值可能是3.5顆星,boolean比如togglebutton的是否勾選,string比如textview的text屬性,當 然除了我們常見的基礎型別外,android的屬性還有特殊的比如color是用於顏色屬性的,可以識別為#ff0000等型別,當然還有 dimension的尺寸型別,比如23dip,15px,18sp的長度單位,還有一種特殊的為reference,一般用於引用@+id/cwj @drawable/***這樣的型別。

當然什麼時候用reference呢? 我們就以定義乙個顏色為例子,

這裡我們用了邏輯或的運算子,定義的紅色是顏色型別的,同時可以被引用。

4、控制項屬性與xml定義繫結。

這下子我們又回到了自定義控制項的編寫上來了。先看看我們在第一點提到的紅色字型部分。這一部分就是實現控制項屬性與xml定義繫結的**。

/**  

* 跟values/attrs.xml裡面定義的屬性繫結  

*/  

typedarray a= 

context

.obtainstyledattributes(attrs,  

r.styleable.radiobutton);  

this.mvalue

= a.getstring(r.styleable.radiobutton_value);  

a.recycle(); 

typedarray其實就是乙個存放資源的array,首先從上下文中獲取到r.styleable.radiobutton這個屬性資源的資源陣列。 attrs是建構函式傳進來,應該就是對應attrs.xml檔案。 a.getstring(r.styleable.radiobutton_value);這句**就是獲取attrs.xml中定義的屬性,並將這個屬 性的值傳給本控制項的mvalue.最後,返回乙個繫結結束的訊號給資源:a.recycle();繫結結束。

5、在xml中對控制項賦初始值。

請看第2點,繫結結束後可以在需要賦初始值的地方賦值。

紅色部分首先宣告命名空間。命名空間為fsms.路徑是這一部分是不變的,後面接的是r的路徑:org.kandy.r。然後在自定義控制項的xml描述中就可以這樣使用fsms:value="true"。這樣就實現了自定義控制項的初始化賦值。

Android 自定義控制項

幹android也有一段的時間了,自定義這塊的東西覺得還是很有比較複習一下基礎的東西。自定義控制項和自定義元件基本上的使用都是在專案中基本的android控制項滿足不了需求的時候使用的。所以,如果要高出特別炫的特效,或者比較特殊的控制項排列方式,例如瀑布流,那麼就要好好學學自定義咯。首先,先簡單的介...

android自定義控制項

android自定義控制項 二 入門,繼承view 說說android 兩種為自定義元件新增屬性的使用方法和區別 自定義控制項的屬性 自定義控制項 今天花了3,4個小時看了自定義控制項,看 懂了,還沒有實踐,因為時間不夠,日後實踐。總結下 自定義控制項有3種方式 繼承已有控制項 繼承乙個容器控制項,...

Android自定義控制項

android學習筆記,整理給自己複習的時候看的,謝謝!1.自定義開關 1.宣告介面物件 public inte ce onswitchstateupdatelistener 2.新增設定介面物件的方法,外部進行呼叫 public void setonswitchstateupdatelistene...