我们通常在写代码的时候,需要自己定义标题栏,并添加相应的点击事件,这些点击事件分为一般的点击事件,比如标题栏的返回按键,每个标题栏都一样,但是有时候我们还要添加一些额外的逻辑处理,这时候,我们可以使用接口回调,来完成这个需求。这样可以避免大量重复代码的编写。
第一步,定义我们的自定义标题栏的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- 这个标题栏我偷懒,仅仅添加了两个按钮
第二步,我们定义相应的点击事件的接口
public interface MyOnClickListener {
void btn1(); //对应第一个按钮的点击事件
void btn2(); //对应第二个按钮的点击事件
}
第三步,代码实现我们的自定义控件的相应的逻辑
public class TitleView extends LinearLayout implements View.OnClickListener{
private View view;
private Button button1,button2;
public TitleView(Context context) {
super(context);
init(context);
}
public TitleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
view= LayoutInflater.from(context).inflate(R.layout.title_view,this);
button1= (Button) view.findViewById(R.id.btn1);
button2= (Button) view.findViewById(R.id.btn2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1:
Toast.makeText(getContext(), "控件内点击事件------btn1", Toast.LENGTH_SHORT).show();
//这里调用接口的方法
myOnClickListener.btn1();
break;
case R.id.btn2:
Toast.makeText(getContext(), "控件内点击事件------btn2", Toast.LENGTH_SHORT).show();
//这里调用接口的方法
myOnClickListener.btn2();
break;
}
}
//这里添加相应的接口的设置方法
private MyOnClickListener myOnClickListener;
public void setMyOnClickListener(MyOnClickListener myOnClickListener){
this.myOnClickListener=myOnClickListener;
}
}
第四步,在主布局文件中引用我们的自定义控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lingzhuo.testtitleview.MainActivity">
<com.lingzhuo.testtitleview.view.TitleView
android:id="@+id/titleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.lingzhuo.testtitleview.view.TitleView>
</RelativeLayout>
第五步,在Activity中添加逻辑处理
public class MainActivity extends AppCompatActivity {
private TitleView titleView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titleView= (TitleView) findViewById(R.id.titleView);
//此处通过接口的回调,添加相应的额外的逻辑处理,简单方便
titleView.setMyOnClickListener(new MyOnClickListener() {
@Override
public void btn1() {
Toast.makeText(MainActivity.this, "我是activity----btn1", Toast.LENGTH_SHORT).show();
}
@Override
public void btn2() {
Toast.makeText(MainActivity.this, "我是activity----btn2", Toast.LENGTH_SHORT).show();
}
});
}
}
我们通过接口的回调,来添加点击事件的相应的逻辑处理
效果图如下:
可以看到,这里不仅执行了我们控件内的逻辑处理,同时接口回调,还添加了额外的逻辑处理。