上面每一个item,看上去好像都是一个horizontal的LinearLayout装载了两个ImageView,一个textView,但是这样写未免太麻烦了,这个布局可以只用一个textview实现,但是如果自定义一个这样的view该怎么写呢。
首先建一个class,继承LinearLayout并给出构造方法:
```
class SettingItemLayout extends LinearLayout{
public SettingItemLayout(Context context,@NullableAttributeSet attrs) {
super(context,attrs);
initLayout(context,attrs);//这个方法用来初始化布局
}
}
```
这时候就要考虑自定义的这个view里面都有些啥东西:
```
ImageView imgLeft;//左边的图标
TextView tv;//文字
privateImageViewimg_tip;//右边的跳转图标
```
有了上面三个变量,这个布局就成型了,但是左边这个图标需要我们动态设置,所以还要声明一个变量用来从外部设置图片资源
```
Drawable drawable;//设置的图片标资源
private intmHeight,mWidth;//图标的宽、高
```
而以上三个变量的值,就需要用到一个东西:attrs(这个位于values下面,名称不一定是attrs你可以随便取,但是大家都取attrs),来看看这个里面有什么:
里面有四个值,分别对应标题的名字,图标的资源文件,图标宽高。关于format:
```
1. reference:参考某一资源ID。如:@drawable/ic_laucher
2. color:颜色值。
3. boolean:布尔值。
4. dimension:尺寸值。
5. float:浮点值。用法:android:fromAlpha ="1.0 "android:toAlpha ="0.7"
6. integer:整型值。用法:android:frameDuration ="100"
7. string:字符串。
8. fraction:百分数。用法:android:pivotX ="200%"
9. enum:枚举值。
```
定义一个属性可以指定多个类型,比如背景,可以指定资源也可以指定具体的颜色值:
```
<attr name ="background"format ="reference|color"/>
定义一个初始化的方法:initLayout(context,attrs);
private void initLayout(Context context,@NullableAttributeSet attrs) {
View.inflate(context,R.layout.base_menu_item_layout, this);//将布局文件加载进来,第三个参数this指装载这个布局的父容器
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);
//这个必须调用
typedArray.recycle();
//然后将获取到的标题和图标资源设置到控件上
tv.setText(title);
imgLeft.setImageDrawable(drawable);
}
```
网友评论