1、方式一 :include
1)定义控件
新建layout_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/id_tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="点击次数"
android:padding="20dp"
android:textSize="30dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/id_btn_item"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/id_btn_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"
android:textSize="30dp"
app:layout_constraintBaseline_toBaselineOf="@+id/id_tv_item"
app:layout_constraintLeft_toRightOf="@+id/id_tv_item"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
新建MyItemLayout类
public class MyItemLayout {
private TextView textView;
private Button button;
private Activity activity;
/**
* 点击事件接口
*/
public interface OnMyClickListener {
void onMyClick(View view);
}
private OnMyClickListener onMyClickListener;
public void setOnMyClickListener(OnMyClickListener myListener) {
this.onMyClickListener = myListener;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onMyClickListener != null) {
onMyClickListener.onMyClick(v);
}
}
});
}
/**
* 初始化
*
* @param activity
*/
public void init(Activity activity) {
this.activity = activity;
textView = activity.findViewById(R.id.id_tv_item);
button = activity.findViewById(R.id.id_btn_item);
}
/**
* 传递文本显示
*
* @param msg
*/
public void setData(String msg) {
textView.setText(msg);
}
}
2)使用控件
在activity_main.xml中插入自定义控件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<include layout="@layout/layout_item" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
在MainActivity中使用控件
private void initLayout() {
final MyItemLayout myItemLayout = new MyItemLayout();
myItemLayout.init(this);
myItemLayout.setOnMyClickListener(new MyItemLayout.OnMyClickListener() {
@Override
public void onMyClick(View view) {
myItemLayout.setData("点击次数: " + cnt++);
}
});
}
最终效果图:
2、方式二:自定义控件
include方式解决了重复编写布局代码的问题,但是如果布局中有一些控件要求能够响应事件,我们还是需要再每个Activity中为这些控件单独编写一次事件注册的代码,比如说标题中的返回按钮,其实不管是在哪一个Activity中,这个按钮的功能都是相同的,即销毁当前Activity,如果在每一个活动中都需要重新注册一遍返回按钮的点击事件,无疑会增加很多重复代码,这种情况最好使用自定义控件的方式解决。
1)定义控件
新建layout_item.xml:
同上
新建MyConstraintLayout类,继承ConstraintLayout:
public class MyConstraintLayout extends ConstraintLayout {
private int cnt = 0;
private TextView textView;
private Button button;
/**
* 构造函数
*
* @param context
* @param attrs
*/
public MyConstraintLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//加载布局
LayoutInflater.from(context).inflate(R.layout.layout_item, this);
//控件
textView = findViewById(R.id.id_tv_item);
button = findViewById(R.id.id_btn_item);
//事件
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("点击次数 : " + cnt++);
}
});
}
}
2)使用控件
在activity_main.xml中插入自定义控件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.myconstraintlayout.MyConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>