自定義Dialog,以及通過接口設置點擊事件

1、自定義一個類,繼承Dialog,創建構造器需使用主題,消除系統默認的背景
public class CustomDialog extends Dialog {
    private OnClickListener mCancelButtonListener;
    private OnClickListener mSmsButtonListener;

    public CustomDialog(@NonNull Context context) {
        super(contextR.style.CustomDialogTheme);
    }
注:在創建構造器的時候,需要使用自定義主題,不然會出現match_parent無效的情況

<!--自定義dialog主題-->
<style name="CustomDialogTheme" parent="Theme.AppCompat.Dialog">
    <!--背景顏色及和透明程度-->
    <item name="android:windowBackground">@color/transparent</item>
</style>


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的位置

通過設置上面的代碼後,運行爲填充全屏
    

3、自定義Dialog實現了,接下來是如何加載這個dialog,首先是創建實體類,然後調用show
/**
 * CustomAlertDialog
 */
private void showCustomAlertDialog() {
    if (mCustomDialog == null) {
        mCustomDialog new CustomDialog(mContext);
    }
    mCustomDialog.show();
}

看到這裏,可能有人會有疑問,dialog中show和create的區別,通過源碼分析,可以發現show是先執行create後,再執行show

4、到此自定義Dialog實現了,可能有人會問,如何實現點擊事件。 點擊事件需要通過接口來實現,實現原理和我們經常用到TextView的setOnClickListener點擊事件一樣
①、在CustomAlerDialog中定義點擊事件接口
public interface OnClickListener {
    void onClick();
}
②、使用接口的實現類,並在對應的點擊事件中調用該接口
private OnClickListener mCancelButtonListener;


③、提供一個公共方法,調用該接口
/**
 * 取消按鈕接口回調
 *
 * @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上面