Android封装自定义布局Dialog

1,857 阅读1分钟

最近重构了一下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解耦。