自定义Dialog,以及通过接口设置点击事件
1、自定义一个类,继承Dialog,创建构造器需使用主题,消除系统默认的背景
public class CustomDialog extends Dialog {
private OnClickListener mCancelButtonListener;
private OnClickListener mSmsButtonListener;
public CustomDialog(@NonNull Context context) {
super(context, R.style.CustomDialogTheme);
}
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>
<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();
}
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的位置
getWindow().setGravity(Gravity.BOTTOM);//Dialog的位置
通过设置上面的代码后,运行为填充全屏。
3、自定义Dialog实现了,接下来是如何加载这个dialog,首先是创建实体类,然后调用show
/**
* CustomAlertDialog
*/
private void showCustomAlertDialog() {
if (mCustomDialog == null) {
mCustomDialog = new CustomDialog(mContext);
}
mCustomDialog.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();
}
void onClick();
}
②、使用接口的实现类,并在对应的点击事件中调用该接口
private OnClickListener mCancelButtonListener;
③、提供一个公共方法,调用该接口
/**
* 取消按钮接口回调
*
* @param cancelButtonListener
*/
public void setCancelButtion(OnClickListener cancelButtonListener) {
mCancelButtonListener = cancelButtonListener;
}
* 取消按钮接口回调
*
* @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();
}
* 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上面