一、定义一个XML布局文件
setting_item_view.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "60dip" > < TextView android:id = "@+id/tv_title" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_marginLeft = "5dip" android:layout_marginTop = "5dip" android:textColor = "#000000" android:textSize = "20dip" /> < TextView android:id = "@+id/tv_desc" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_below = "@+id/tv_title" android:layout_marginLeft = "5dip" android:layout_marginBottom = "5dip" android:textColor = "#99000000" android:textSize = "18dip" /> < CheckBox android:clickable = "false" android:focusable = "false" android:id = "@+id/cb_status" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentRight = "true" android:layout_centerVertical = "true" android:layout_marginRight = "20dip" /> < View android:layout_width = "fill_parent" android:layout_height = "0.2dip" android:layout_alignParentBottom = "true" android:layout_alignParentLeft = "true" android:layout_marginLeft = "5dip" android:layout_marginRight = "5dip" android:background = "#000000" /> </ RelativeLayout > |
二、在src/values/attrs.xml中定义属性
1
2
3
4
5
6
7
8
9
10
11
|
<? xml version = "1.0" encoding = "utf-8" ?> < resources > < declare-styleable name = "TextView" > < attr name = "title" format = "string" /> < attr name = "desc_on" format = "string" /> < attr name = "desc_off" format = "string" /> </ declare-styleable > </ resources > |
三、自定义一个view继承自你需要的布局
iniview(Context context)初始化自定义的布局文件
根据需求自定义一些API方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class SettingItemView extends RelativeLayout { private CheckBox cb_status; private TextView tv_title; private TextView tv_desc; private String title; private String desc_on; private String desc_off; public void iniview(Context context){ View.inflate(context, R.layout.setting_item_view, this ); cb_status = (CheckBox)findViewById(R.id.cb_status); tv_title = (TextView)findViewById(R.id.tv_title); tv_desc = (TextView)findViewById(R.id.tv_desc); } public SettingItemView(Context context, AttributeSet attrs, int defStyle) { super (context, attrs, defStyle); iniview(context); } public SettingItemView(Context context, AttributeSet attrs) { super (context, attrs); iniview(context); title = attrs.getAttributeValue( "http://schemas.android.com/apk/res/com.victor.mobilesafe" , "title" ); desc_on = attrs.getAttributeValue( "http://schemas.android.com/apk/res/com.victor.mobilesafe" , "desc_on" ); desc_off = attrs.getAttributeValue( "http://schemas.android.com/apk/res/com.victor.mobilesafe" , "desc_off" ); tv_title.setText(title); setDesc(desc_off); } public SettingItemView(Context context) { super (context); iniview(context); } public boolean isChecked(){ return cb_status.isChecked(); } public void setChecked( boolean checked){ if (checked) { setDesc(desc_on); } else { setDesc(desc_off); } cb_status.setChecked(checked); } public void setDesc(String text){ tv_desc.setText(text); } } |
四、在布局文件中使用该自定义组合控件
别忘记声明自定义命名空间
xmlns:victor="http://schemas.android.com/apk/res/com.victor.mobilesafe"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:victor = "http://schemas.android.com/apk/res/com.victor.mobilesafe" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" > < com.victor.mobilesafe.ui.SettingItemView android:id = "@+id/siv_update" android:layout_width = "wrap_content" android:layout_height = "wrap_content" victor:desc_off = "自动更新关闭" victor:desc_on = "自动更新开启" victor:title = "设置自动更新" > </ com.victor.mobilesafe.ui.SettingItemView > </ LinearLayout > |
总结:
1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup;
2.实现父类的构造方法。一般来说,需要在构造方法里初始化自定义的布局文件;
3.根据一些需要或者需求,定义一些API方法;
4.根据需要,自定义控件的属性,可以参照TextView属性;
5.自定义命名空间,例如:
1
2
3
|
xmlns:victor="http://schemas.android.com/apk/res/<包名>" xmlns:victor="http://schemas.android.com/apk/res/com.victor.mobilesafe" |
6.自定义我们的属性,在Res/values/attrs.xml
7.使用我们自定义的属性
例如:
1
2
3
4
5
|
itheima:title="设置自动更新" itheima:desc_on="设置自动更新已经开启" itheima:desc_off="设置自动更新已经关闭" |
8.在我们自定义控件的带有两个参数的构造方法里AttributeSet attrs 取出我们的属性值,关联自定义布局文件对应的控件。