有时候一个布局需要重复被使用,为了避免更改其中一个布局可能造成所有相同的布局都要更改的局面,所以把这些相同的布局抽取出来,封装成一个布局文件。
本次组合是使用一个TextView加上一个CheckBox,大概的样子就如图所示了。
创建一个setting_custom.xml的文件,布局如下。
取消掉CheckBox的点击事件,使得整个控件可以被点击。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33000000">
<TextView
android:id="@+id/tv_custom_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="这是一个示例"
android:textSize="20sp"/>
<!--取消掉CheckBox的点击事件-->
<CheckBox
android:id="@+id/cb_custom_check"
android:clickable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_margin="5dp"/>
</RelativeLayout>
在CustomSetting.java中开始写代码
package com.example.customwidget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
创建一个CustomSetting去继承LinearLayout,然后写出CustomSetting的构造函数
*/
public class CustomSetting extends LinearLayout {
private View item;
private TextView tv_con;
private CheckBox cb_check;
/*
在构造函数中进行初始化界面和事件
*/
public CustomSetting(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
initEvent();
}
private void initEvent() {
cb_check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
tv_con.setText("被勾选了");
}else {
tv_con.setText("没被勾选");
}
}
});
}
private void initView() {
item = View.inflate(getContext(), R.layout.setting_custom, null);
addView(item);
tv_con = (TextView) item.findViewById(R.id.tv_custom_content);
cb_check = (CheckBox) item.findViewById(R.id.cb_custom_check);
}
/*
以下是对外界提供一些方法,可以用来更改组合控件的文字显示,以及使用点击事件
*/
public void setCustomContent(String text){
tv_con.setText(text);
}
public void setIsChecked(boolean isChecked){
cb_check.setChecked(isChecked);
}
public boolean isChecked(){
return cb_check.isChecked();
}
public void setItemClickListener(OnClickListener listener){
item.setOnClickListener(listener);
}
}
在activity_main.xml中设置activity的主界面
<?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="match_parent">
<!--使用包名+类名-->
<com.example.customwidget.CustomSetting
android:id="@+id/cs_main"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.customwidget.CustomSetting>
</RelativeLayout>
package com.example.customwidget;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private CustomSetting cs_con;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initEvent();
}
private void initEvent() {
cs_con.setCustomContent("暂时还没有被点击"); //设置文字
//对整个控件使用点击事件,从而改变CheckBox的状态
cs_con.setItemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cs_con.setIsChecked(!cs_con.isChecked());
}
});
}
private void initView() {
setContentView(R.layout.activity_main);
//需要向下转型成CustomSetting
cs_con = (CustomSetting) findViewById(R.id.cs_main);
}
}
最终效果如下
点击后:
取消勾选: