上面每一個(gè)item十嘿,看上去好像都是一個(gè)horizontal的LinearLayout裝載了兩個(gè)ImageView因惭,一個(gè)textView,但是這樣寫未免太麻煩了绩衷,這個(gè)布局可以只用一個(gè)textview實(shí)現(xiàn)蹦魔,但是如果自定義一個(gè)這樣的view該怎么寫呢。
首先建一個(gè)class咳燕,繼承LinearLayout并給出構(gòu)造方法:
```
class SettingItemLayout extends LinearLayout{
public SettingItemLayout(Context context,@NullableAttributeSet attrs) {
super(context,attrs);
initLayout(context,attrs);//這個(gè)方法用來初始化布局
}
}
```
這時(shí)候就要考慮自定義的這個(gè)view里面都有些啥東西:
```
ImageView imgLeft;//左邊的圖標(biāo)
TextView tv;//文字
privateImageViewimg_tip;//右邊的跳轉(zhuǎn)圖標(biāo)
```
有了上面三個(gè)變量勿决,這個(gè)布局就成型了,但是左邊這個(gè)圖標(biāo)需要我們動(dòng)態(tài)設(shè)置招盲,所以還要聲明一個(gè)變量用來從外部設(shè)置圖片資源
```
Drawable drawable;//設(shè)置的圖片標(biāo)資源
private intmHeight,mWidth;//圖標(biāo)的寬低缩、高
```
而以上三個(gè)變量的值,就需要用到一個(gè)東西:attrs(這個(gè)位于values下面,名稱不一定是attrs你可以隨便取咆繁,但是大家都取attrs)讳推,來看看這個(gè)里面有什么:
里面有四個(gè)值,分別對(duì)應(yīng)標(biāo)題的名字玩般,圖標(biāo)的資源文件银觅,圖標(biāo)寬高。關(guān)于format:
```
1. reference:參考某一資源ID。如:@drawable/ic_laucher
2. color:顏色值。
3. boolean:布爾值剧辐。
4. dimension:尺寸值。
5. float:浮點(diǎn)值洒忧。用法:android:fromAlpha ="1.0 ?"android:toAlpha ="0.7"
6. integer:整型值。用法:android:frameDuration ="100"
7. string:字符串帘撰。
8. fraction:百分?jǐn)?shù)跑慕。用法:android:pivotX ="200%"
9. enum:枚舉值。
```
定義一個(gè)屬性可以指定多個(gè)類型摧找,比如背景,可以指定資源也可以指定具體的顏色值:
```
<attr name ="background"format ="reference|color"/>
定義一個(gè)初始化的方法:initLayout(context,attrs);
private void initLayout(Context context,@NullableAttributeSet attrs) {
View.inflate(context,R.layout.base_menu_item_layout, this);//將布局文件加載進(jìn)來牢硅,第三個(gè)參數(shù)this指裝載這個(gè)布局的父容器
imgLeft= (ImageView) findViewById(R.id.img_myzne);
img_tip= (ImageView) findViewById(R.id.img_tip);
tv= (TextView) findViewById(R.id.tv);
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.base_menu_item);
String title = typedArray.getString(R.styleable.base_menu_item_menu_item_name);
drawable= typedArray.getDrawable(R.styleable.base_menu_item_drawableleft_src);
mWidth=typedArray.getDimensionPixelSize(R.styleable.base_menu_item_drawableleft_width,0);
mHeight=typedArray.getDimensionPixelSize(R.styleable.base_menu_item_drawableleft_height,
0);
//這個(gè)必須調(diào)用
typedArray.recycle();
//然后將獲取到的標(biāo)題和圖標(biāo)資源設(shè)置到控件上
tv.setText(title);
imgLeft.setImageDrawable(drawable);
}
```