Android

Android Dialog使用之-DialogFragment

2020-08-25  本文已影响0人  可乐_JS
/**
 * Des: 退出登录提示dialog
 * Created by kele on 2020/8/10.
 * E-mail:984127585@qq.com
 */
public class ExitLoginNoticeDialog extends BaseDialogFragment {

    private static final String TAG = ExitLoginNoticeDialog.class.getSimpleName();
    private Callback mCallback;

    private ExitLoginNoticeDialog(int width, int height, int gravity) {
        super(width, height, gravity);
    }

    public static ExitLoginNoticeDialog show(FragmentManager fm) {
        ExitLoginNoticeDialog dialog = new ExitLoginNoticeDialog((int) (ScreenUtils.getAppScreenWidth() * 0.8), WindowManager.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
        dialog.show(fm, TAG);
        return dialog;
    }

    @Override
    protected int getLayoutId() {
        return R.layout.dialog_exit_login_notice;
    }

    @Override
    protected void initViews(View v) {
        v.findViewById(R.id.cancel_btn_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        v.findViewById(R.id.sure_btn_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
                if (null != mCallback) {
                    mCallback.onClickSure();
                }
            }
        });
    }

    public void setCallback(Callback cb) {
        mCallback = cb;
    }

    public interface Callback {
        void onClickSure();
    }
}
/**
 * Des: dialog基类
 * Created by kele on 2020/7/23.
 * E-mail:984127585@qq.com
 */
public abstract class BaseDialogFragment extends DialogFragment {

    private static final String TAG = BaseDialogFragment.class.getSimpleName();

    private int DEFAULT_WIDTH = WindowManager.LayoutParams.MATCH_PARENT;
    private int DEFAULT_HEIGHT = WindowManager.LayoutParams.WRAP_CONTENT;
    private int DEFAULT_GRAVITY = Gravity.BOTTOM;

    private Dialog dialog;

    public BaseDialogFragment() {
        this(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
    }

    public BaseDialogFragment(int width, int height, int gravity) {
        DEFAULT_WIDTH = width;
        DEFAULT_HEIGHT = height;
        DEFAULT_GRAVITY = gravity;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        View view = inflater.inflate(getLayoutId(), container, false);
        initViews(view);
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        dialog = getDialog();
        if (null != dialog) {
            Window window = dialog.getWindow();
            if (null != window) {
                window.getDecorView().setPadding(0, 0, 0, 0);
                window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.width = DEFAULT_WIDTH;
                lp.height = DEFAULT_HEIGHT;
                lp.gravity = DEFAULT_GRAVITY;
                lp.windowAnimations = android.R.style.Animation_InputMethod;
                window.setAttributes(lp);
            }
            dialog.setCancelable(true);
            dialog.setCanceledOnTouchOutside(true);
        }
    }

    public void setCancelable(boolean cancelable) {
        if (null == dialog) {
            return;
        }
        dialog.setCancelable(cancelable);
    }

    public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
        if (null == dialog) {
            return;
        }
        dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
    }

    @Override
    public void show(@NonNull FragmentManager manager, @Nullable String tag) {
        super.show(manager, tag);
    }

    protected abstract int getLayoutId();

    protected abstract void initViews(View v);
}

纠错-200923

上文中的关于设置dialog可取消、点击外部可取消设置的代码有误,今天在使用的时候才发现的,更新下

BaseDialogFragment中新增成员变量:

    private boolean mCancelable =true;//默认可取消
    private boolean mCanceledOnTouchOutside=true;//默认点击外部可取消

onStart中的代码修改:

            dialog.setCancelable(mCancelable);
            dialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside);

BaseDialogFragment中的方法修改:

    public void setCancelable(boolean cancelable) {
        mCancelable =cancelable;
    }

    public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
        mCanceledOnTouchOutside =canceledOnTouchOutside;
    }

优化BaseDialog

/**
 * Des: BaseDialog
 * Created by kele on 2020/11/22.
 * E-mail:984127585@qq.com
 */
public abstract class BaseDialog extends DialogFragment {

    private int DEFAULT_WIDTH = WindowManager.LayoutParams.MATCH_PARENT;//宽
    private int DEFAULT_HEIGHT = WindowManager.LayoutParams.WRAP_CONTENT;//高
    private int DEFAULT_GRAVITY = Gravity.CENTER;//位置

    private boolean mCancelable = true;//默认可取消
    private boolean mCanceledOnTouchOutside = true;//默认点击外部可取消

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View mView = inflater.inflate(getLayoutId(), container, false);
        initViews(mView);
        return mView;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog mDialog = super.onCreateDialog(savedInstanceState);
        if (null != mDialog) {//初始化
            mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            mDialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside);
            mDialog.setCancelable(mCancelable);
            Window window = mDialog.getWindow();
            if (null != window) {
                window.getDecorView().setPadding(0, 0, 0, 0);
                window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.width = DEFAULT_WIDTH;
                lp.height = DEFAULT_HEIGHT;
                lp.gravity = DEFAULT_GRAVITY;
                lp.windowAnimations = android.R.style.Animation_InputMethod;
                window.setAttributes(lp);
            }
            mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    return !mCancelable;
                }
            });
        }
        return mDialog;
    }

    /**
     * 设置位置
     * @param gravity
     */
    public void setGravity(int gravity) {
        DEFAULT_GRAVITY = gravity;
    }

    /**
     * 设置宽
     * @param width
     */
    public void setWidth(int width) {
        DEFAULT_WIDTH = width;
    }

    /**
     * 设置高
     * @param height
     */
    public void setHeight(int height) {
        DEFAULT_HEIGHT = height;
    }

    /**
     * 设置点击返回按钮是否可取消
     *
     * @param cancelable
     */
    public void setCancelable(boolean cancelable) {
        mCancelable = cancelable;
    }

    /**
     * 设置点击外部是否可取消
     *
     * @param canceledOnTouchOutside
     */
    public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
        mCanceledOnTouchOutside = canceledOnTouchOutside;
    }

    /**
     * 设置布局
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 初始化Views
     *
     * @param v
     */
    protected abstract void initViews(View v);
}

用法和上述基本相同

上一篇下一篇

猜你喜欢

热点阅读