一、定义一个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 取出我们的属性值,关联自定义布局文件对应的控件。