一、定义一个XML布局文件
setting_item_view.xml
<?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" ><TextViewandroid: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" /><TextViewandroid: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" /><CheckBoxandroid: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" /><Viewandroid: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中定义属性<?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方法
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"
<?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.SettingItemViewandroid: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.自定义命名空间,例如:
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.使用我们自定义的属性
例如:
itheima:title="设置自动更新" itheima:desc_on="设置自动更新已经开启" itheima:desc_off="设置自动更新已经关闭"
8.在我们自定义控件的带有两个参数的构造方法里AttributeSet attrs 取出我们的属性值,关联自定义布局文件对应的控件。