小记一次自定义ui布局的Dialog实现
很多时候我们会收到设计师各种花样别出的弹窗需求,比如各种颜色背景和圆角的设计,这时候可以使用安卓自带的dialog小巧快速的实现这种自定义的弹窗,安卓系统自带的系统dialog背景是直角白底的,我们需要先按ui设计图写好我们的xml布局
步骤一:按ui设计图画xml布局
- 先画一个圆角shape文件shape_white_radius_10dp.xml来当做背景,在drawable文件夹加入
- 接着上我们的ui布局,my_dialog.xml
步骤二:自定义弹窗的样式,在themes.xml加入
步骤三:代码实现部分
public static void showDialog(Context mContext, String contentStr, boolean isCancleDialog) {
View rootview = View.inflate(mContext, R.layout.my_dialog, null);
TextView tvmsg = rootview.findViewById(R.id.tv_msg);
Button btCancel = rootview.findViewById(R.id.bt_cancel);
Button btConfig = rootview.findViewById(R.id.bt_config);
tvmsg.setText(contentStr);
tvmsg.setMovementMethod(ScrollingMovementMethod.getInstance());//内容滚动
final AlertDialog dialog = new AlertDialog.Builder(mContext, R.style.FragDialog_Common).create();
dialog.setCanceledOnTouchOutside(isCancleDialog);
dialog.setCancelable(isCancleDialog);
dialog.setView(rootview);
dialog.show();
btCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dialog != null)
dialog.dismiss();
}
});
btConfig.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dialog != null)
dialog.dismiss();
}
});
}
最终效果如下图预览
在实际开发中遇到一些问题:
明明我在shape文件中设置好了粉色背景和20dp的圆角,始终真机显示不出这个效果。查询有说在代码中dialog获取到window设置窗口背景才能生效的,给他照办了,发现无效果。
dialog.getWindow().setBackgroundDrawable();
dialog.getWindow().setBackgroundDrawableResource();
dialog.getWindow().setBackgroundBlurRadius();
都设置一遍,依然无效果
- 最后坑点是,我这是分模块开发的项目,自定义的dialog是在子模块里的,在主工程有一个shape_white_radius_10dp.xml文件同名的shape文件。在
预览时
,xml设置的背景文件引用的是子module
的shape文件,在编译期
引用的就是使用的主工程同名
的shape文件。这导致我一直更改子module的shape文件样式却看不到我想要的效果。只要把我们dialog引用的背景文件修改为项目工程内唯一名字就好了
- 此外发现不止是同名文件的引用,themes里的style设置只要是同名的,都会优先使用主工程已有的资源
- 最后有遇到如果主工程和子工程拥有同名的layout布局文件,会导致莫名的R文件中id异常情况,一直提示你控件view的id错误,导致无法编译