最近重构了一下Dialog,正好做一下统一封装。
定义BaseDialog
BaseDialog 定义成abstract,主要是负责控制整个dialog的流程。
public abstract class BaseDialog<T extends Dialog> {
private T mDialog;
protected int layoutId;
protected Context mContext;
public BaseDialog(Context mContext) {
this.mContext = mContext;
}
protected T getDialog(){
return mDialog;
}
public void show(){
layoutId=setLayoutId();
mDialog=initDialog(mContext);
mDialog.show();
View view= LayoutInflater.from(mContext).inflate(layoutId,null,false);
mDialog.setContentView(view);
//单独处理dialog中的事件
onShowDialog(mDialog,view);
mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
onDialogDismiss(mDialog);
}
});
mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
onDialogShow(mDialog);
}
});
}
abstract int setLayoutId();
abstract T initDialog(Context context);
abstract void onShowDialog(T dialog,View view);
abstract void onDialogDismiss(T dialog);
abstract void onDialogShow(T dialog);
使用泛型这样可以使用不同的dialog,集成BaseDialog以后,重写几个方法就行,下面是我使用的方法:
public class SystemDateDialog extends BaseDialog<AlertDialog> {
public static final int DIS_Mis_Time = 4_000;
private SetDateListener setDateListener;
public SystemDateDialog(Context mContext, SetDateListener setDateListener) {
super(mContext);
this.setDateListener = setDateListener;
}
public static SystemDateDialog create(Context context, SetDateListener setDateListener) {
return new SystemDateDialog(context, setDateListener);
}
@Override
int setLayoutId() {
return R.layout.dialog_system_date;
}
@Override
AlertDialog initDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.MyDialog);
AlertDialog dialog = builder.create();
return dialog;
}
@Override
void onShowDialog(AlertDialog dialog, View view) {
autoDismiss(dialog, view);
setDateListener.onShow(dialog,view);
}
@Override
void onDialogDismiss(AlertDialog dialog) {
}
@Override
void onDialogShow(AlertDialog dialog) {
}
private void autoDismiss(final Dialog dialog, final View view) {
CountDownTimer countDownTimer = new CountDownTimer(DIS_Mis_Time, 1000) {
@Override
public void onTick(long millisUntilFinished) {
TextView tvTip = (TextView) view.findViewById(R.id.tv_close_time);
tvTip.setText(millisUntilFinished / 1000 + "秒后自动关闭");
}
@Override
public void onFinish() {
// dialog.dismiss();
}
};
countDownTimer.start();
}
public interface SetDateListener {
void onShow(Dialog dialog, View view);
}
}
这是一个四秒后会自动消失的dialog:
- onShowDialog 这个回调中写dialog显示以后要实现的业务逻辑。
- initDialog 这个回调创建想要的dialog,包括对dialog的一些设置。
- setLayoutId 设置布局。
- SetDateListener 设置数据的一个接口,实现数据和dialog解耦。