组合控件布局文件
首先定义一个组合控件的布局文件
view_setting_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="70dp"
android:padding="5dp" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="22sp" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_marginTop="3dp"
android:textColor="#a000"
android:textSize="18sp" />
<CheckBox
android:id="@+id/cb_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false" />
<View
android:layout_width="match_parent"
android:layout_height="0.2dp"
android:layout_alignParentBottom="true"
android:background="#a000" />
</RelativeLayout>
定义一个包含组合控件的类
这个类可以是继承至ViewGroup的任何类,这样就可以将上面定义的布局文件放在这个类中。
SettingItemView.java
package com.itheima52.mobilesafe.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.itheima52.mobilesafe.R;
/**
* 设置中心的自定义组合控件
*/
public class SettingItemView extends RelativeLayout {
// 定义一个命名空间
private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.itheima52.mobilesafe";
private TextView tvTitle;
private TextView tvDesc;
private CheckBox cbStatus;
private String mTitle;
private String mDescOn;
private String mDescOff;
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public SettingItemView(Context context, AttributeSet attrs) {
super(context, attrs);
// 根据属性名称,获取属性的值
mTitle = attrs.getAttributeValue(NAMESPACE, "title");
mDescOn = attrs.getAttributeValue(NAMESPACE, "desc_on");
mDescOff = attrs.getAttributeValue(NAMESPACE, "desc_off");
initView();
// 打印出所有的属性
// int attributeCount = attrs.getAttributeCount();
//
// for (int i = 0; i < attributeCount; i++) {
// String attributeName = attrs.getAttributeName(i);
// String attributeValue = attrs.getAttributeValue(i);
//
// System.out.println(attributeName + "=" + attributeValue);
// }
}
public SettingItemView(Context context) {
super(context);
initView();
}
/**
* 初始化布局
*/
private void initView() {
// 将自定义好的布局文件设置给当前的SettingItemView
View.inflate(getContext(), R.layout.view_setting_item, this);
tvTitle = (TextView) findViewById(R.id.tv_title);
tvDesc = (TextView) findViewById(R.id.tv_desc);
cbStatus = (CheckBox) findViewById(R.id.cb_status);
// 设置标题
setTitle(mTitle);
}
public void setTitle(String title) {
tvTitle.setText(title);
}
public void setDesc(String desc) {
tvDesc.setText(desc);
}
public boolean isChecked() {
return cbStatus.isChecked();
}
public void setChecked(boolean check) {
cbStatus.setChecked(check);
// 根据选择的状态,更新文本描述
if (check) {
setDesc(mDescOn);
} else {
setDesc(mDescOff);
}
}
}
使用自定义组合控件
在布局文件中使用我们自定义的组合控件,注意需要引入对应的命名空间。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:itheima="http://schemas.android.com/apk/res/com.itheima52.mobilesafe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="@style/TitleStyle"
android:text="设置中心" />
<com.itheima52.mobilesafe.view.SettingItemView
android:id="@+id/siv_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
itheima:desc_off="自动更新已关闭"
itheima:desc_on="自动更新已开启"
itheima:title="自动更新设置" />
</LinearLayout>
访问自定义的组合控件
通过id引用到我们的自定义组件过后,就可以调用这个view的各种方法来设置组合控件里面各个控件的属性了。
package com.itheima52.mobilesafe.activity;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.view.SettingItemView;
/**
* 设置中心
*
*/
public class SettingActivity extends Activity {
private SettingItemView sivUpdate;// 设置升级
private SharedPreferences mPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
mPref = getSharedPreferences("config", MODE_PRIVATE);
sivUpdate = (SettingItemView) findViewById(R.id.siv_update);
boolean autoUpdate = mPref.getBoolean("auto_update", true);
if (autoUpdate) {
sivUpdate.setChecked(true);
} else {
sivUpdate.setChecked(false);
}
sivUpdate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 判断当前的勾选状态
if (sivUpdate.isChecked()) {
// 设置不勾选
sivUpdate.setChecked(false);
// 更新sp
mPref.edit().putBoolean("auto_update", false).commit();
} else {
sivUpdate.setChecked(true);
// 更新sp
mPref.edit().putBoolean("auto_update", true).commit();
}
}
});
}
}