参考借鉴自:https://www.cnblogs.com/xiaoxiaoqingyi/p/6738108.html 在此表示感谢。
Dialog也用过很多次了,但是每次都没好好的封装起来以便以后使用,这次趁热打铁,记录下来。
原文作者的实现方法,跟我的想法还有点出入,所以我在参考的基础上,自己封装了一个更通用的实现。如有不足之处,欢迎纰漏。
1、原文中作者将布局写在自定义的Dialog里面了,这样很难复用,我的实现方法如下:
public MyDialog(Context context,int layoutResId,boolean canCloseByTouchOutside){
this(context);
this.layoutResId = layoutResId;//布局ID
setCanceledOnTouchOutside(canCloseByTouchOutside);
}
private MyDialog(@NonNull Context context) {
this(context, R.style.dialog);
}
private MyDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, themeResId);
}
将布局作为参数,在初始化的时候传入
2、事件
由于布局的自由度提高了,内容可能千奇百怪,所以事件不能在封装的类中写了,可以把自定义的Dialog封装成抽象类,在onCreate的时候实现抽象方法initView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layoutResId);
initView(this);
}
public abstract void initView(Dialog dialog);
来看一下居然在使用的时候怎么写吧
new MyDialog(MyActivity.this, R.layout.dialog, true) {
@Override
public void initView(final Dialog dialog) {
dialog.findViewById(R.id.dialog_yes).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something......
dialog.dismiss();
}
});
dialog.findViewById(R.id.dialog_no).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
//do something......
}
});
}
}.show();
在Activity或者Fragment使用时,必须实现initView方法,在该方法中就可以findview和添加listener了。
如果在另一个地方要使用,定义好布局文件后,同样的方法使用就可以了。