1、自定義一個類,繼承Dialog,創建構造器需使用主題,消除系統默認的背景
public class CustomDialog extends Dialog {
private OnClickListener mCancelButtonListener;
private OnClickListener mSmsButtonListener;
public CustomDialog(@NonNull Context context) {
super(context, R.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_PARENT, ViewGroup.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();
}