Java到Android小项目(自定义Dialog)来理解接口回
1.首先来看演示结果:
案例代码目录结构:
1.未运行时候的界面:
2.运行之后项目:(最底层MainActivity.class界面,上册绿色是自定义的CustomDialog界面)
3.点击x号:将消失,点击购买套餐将调整到对应页面
2.分析过程:
首先CustomDialog是外部自定义的一个弹窗,所以弹窗里面的关闭和购买控件属于弹窗本身而不属于MainActivity.class,在MainActivity里面无法实例化,所以到我们需要关闭和购买时候,无法MainActivity.class里面进行相应的事件操作。这时候我们就需要定义一个接口(LeaveMyDialogListener),在MainActivity.class里面实现接口(或者内部类形式),将MainActivity对象(接口)的引用通过CustomDialog的一个方法以参数形式传递到CustomDialog.class给CustomDialog里面的接口变量赋值(this.listener= listeners;),在需要时候通过接口方法来实现回调。
3.代码过程:
1.自定义的Dialog类:
public classCustomDialogextendsDialogimplementsView.OnClickListener {
privateContextcontext;
privateLeaveMyDialogListenerlistener;
//创建接口用来实现回调(可以在内部也可以定义一个单独的接口看你习惯了)
interfaceLeaveMyDialogListener {
voidonClick(View view);
}
privateImageButtonib_buy_pac_close;
privateImageButtonib_buy_pac_btn;
//TODO这里是imageView这张图片的背景。
privateStringmimage;
publicCustomDialog(@NonNullContext context) {
super(context);
}
//3.这里给接口变量赋值
publicCustomDialog(Context context,inttheme, LeaveMyDialogListener listeners) {
super(context, theme);
this.context= context;
this.listener= listeners; //3.这里给接口变量赋值
}
//4.创建Activity
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_dialog);
initView();
}
private voidinitView() {
//5.实例化控件
ib_buy_pac_close= (ImageButton) findViewById(R.id.ib_buy_pac_close);
ib_buy_pac_btn= (ImageButton) findViewById(R.id.ib_buy_pac_btn);
//7.点击之后
ib_buy_pac_close.setOnClickListener(this);
ib_buy_pac_btn.setOnClickListener(this);
}
//8.当点击关闭和购买时候触发接口进行回调
@Override
public voidonClick(View v) {
listener.onClick(v);
}
}
1.MainActivity.class代码:
public classMainActivityextendsAppCompatActivity {
privateCustomDialogcustomDialog;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.首先实例化
initView();
//6.然后显示弹窗
customDialog.show();
}
private voidinitView() {
/*2.这里是内部类的写法,当然也可以实现接口:看你喜好*/
customDialog=newCustomDialog(this, R.style.Theme_AppCompat_Light,newCustomDialog.LeaveMyDialogListener() {
@Override
public voidonClick(View view) {
switch(view.getId()) {
//9.实现回调
caseR.id.ib_buy_pac_close:
customDialog.dismiss();
break;
caseR.id.ib_buy_pac_btn:
startActivity(newIntent(MainActivity.this, ToOtherActivity.class));
break;
}}});}
}
当然就这个案例是相对于接口回调来自定义的一个外部弹窗:我们如果不想用接口回调我们可以在MainActivity.class里面自定义View布局设置弹窗。就不用使用接口回调。