自定义Dialog,以及通过接口设置点击事件

源码在GitHub上面
1、自定义一个类,继承Dialog,创建构造器需使用主题,消除系统默认的背景
public class CustomDialog extends Dialog {
    private OnClickListener mCancelButtonListener;
    private OnClickListener mSmsButtonListener;

    public CustomDialog(@NonNull Context context) {
        super(contextR.style.CustomDialogTheme);
    }
注:在创建构造器的时候,需要使用自定义主题,不然会出现match_parent无效的情况


name="CustomDialogTheme" parent="Theme.AppCompat.Dialog">
   
    name="android:windowBackground">@color/transparent


2、在onCreate中使用setContentView加载布局
@Override
protected void  onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState) ;
    setContentView(R.layout. dialog_share) ;
    ButterKnife. bind( this) ;
    initWindow() ;
}
注:你会发现布局中使用的是match_parent,并且预览的时候,也是填充全屏,但是运行的时候却不是全屏的。这个时候需要调用代码主动设置布局的大小

getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENTViewGroup.LayoutParams.WRAP_CONTENT);
getWindow().setGravity(Gravity.BOTTOM);//Dialog的位置

通过设置上面的代码后,运行为填充全屏
自定义Dialog,以及通过接口设置点击事件_第1张图片    自定义Dialog,以及通过接口设置点击事件_第2张图片

3、自定义Dialog实现了,接下来是如何加载这个dialog,首先是创建实体类,然后调用show
/**
 * CustomAlertDialog
 */
private void showCustomAlertDialog() {
    if (mCustomDialog == null) {
        mCustomDialog new CustomDialog(mContext);
    }
    mCustomDialog.show();
}

看到这里,可能有人会有疑问,dialog中show和create的区别,通过源码分析,可以发现show是先执行create后,再执行show
更详细的请看这篇文章, 创建对话框AlertDialog中show和create的区别,以及销毁对话框cancel、dismiss、hide三者之间的区别

4、到此自定义Dialog实现了,可能有人会问,如何实现点击事件。 点击事件需要通过接口来实现,实现原理和我们经常用到TextView的setOnClickListener点击事件一样
①、在CustomAlerDialog中定义点击事件接口
public interface OnClickListener {
    void onClick();
}
②、使用接口的实现类,并在对应的点击事件中调用该接口
private OnClickListener mCancelButtonListener;
自定义Dialog,以及通过接口设置点击事件_第3张图片

③、提供一个公共方法,调用该接口
/**
 * 取消按钮接口回调
 *
 * @param cancelButtonListener
 */
public void setCancelButtion(OnClickListener cancelButtonListener) {
    mCancelButtonListener = cancelButtonListener;
}

④、创建自定义类的时候,调用上面的方法
/**
 * CustomAlertDialog
 */
private void showCustomAlertDialog() {
    if (mCustomDialog == null) {
        mCustomDialog new CustomDialog(mContext);
        mCustomDialog.setCancelButtion(new CustomDialog.OnClickListener() {
            @Override
            public void onClick() {
                ToastUtils.showShort("cancel");
            }
        });
        mCustomDialog.setSmsButton(new CustomDialog.OnClickListener() {
            @Override
            public void onClick() {
                ToastUtils.showShort("sms");
            }
        });
    }
    mCustomDialog.show();
}


到此,整个自定义Dialog实现了,源码在GitHub上面




你可能感兴趣的:(自定义Dialog,以及通过接口设置点击事件)