在最近写的项目中,Dialog 有各种各样的显示问题, 无论是 用dialog ,还是 alertDialog , 都会有一系列的 黑边, 黑底白字,全屏等 各种意外的结果,而且无论自己怎样自定义样式,都得不到很好的解决.经过一段时间的研究,尝试. 自己得出了自己的解决办法. 供大家参考使用.
首先,来普及一下Dialog 的基础知识,Dialog 是一种基于容器的对话框
已知的直接子类
AppCompatDialog 基类AppCompat主题对话框。
CharacterPickerDialog 对话框选择重音字符相关的基本性格。
MediaRouteChooserDialog 这个类实现MediaRouter的路线选择器对话框。
已知的间接子类(支持包)
AlertDialog 一个子类可以显示一个对话框,两个或三个按钮。
DatePickerDialog 一个简单的对话框包含一个DatePicker。
MediaRouteControllerDialog这个类实现了路由控制器MediaRouter对话框。
ProgressDialog一个对话框显示一个进度指示器和一个可选的文本消息或视图。
TimePickerDialog一个对话框,提示用户使用TimePicker每天的时间。
以上的dialog ,在项目应用的过程中,会由于项目主题,或者尺寸等问题,出现不良的用户体验, 下面 我们一起来看一下.
1. 选择改变dialog主题样式
Dialog baseDialog = new Dialog(context, R.style.default_dialog_style);
然后在style.xml 中修改样式即可,当然样式可选择继承 其他的dialog ,大家可以参考下,当然还有字体的相关设定.
<style name="default_dialog_style"> <item name="android:windowIsFloating">true</item><!--是否悬浮--> <item name="android:windowIsTranslucent">true</item><!--背景是否半透明--> <item name="android:windowFrame">@null</item><!--Dialog的windowFrame框为无--> <item name="android:windowNoTitle">true</item><!--Dialog无标题--> <item name="android:windowBackground">@android:color/transparent</item> <!--背景为透明色--> <item name="android:windowContentOverlay">@null</item><!-- 设置窗体内容背景--> <item name="android:radius">5dp</item><!--边角弧度--> <item name="windowBackground"> 窗体的背景 </item> <item name="windowFullscreen">false</item> 是否为全屏 <item name="windowOverscan">false</item> 是否要求窗体铺满整屏幕 <item name="windowShowWallpaper">false</item> 是否显示壁纸 <item name="windowTitleStyle">@android :style/WindowTitle</item> 窗体的标题栏Style <item name="windowTitleSize">25dip</item> 窗体文字大小 <item name="android:backgroundDimEnabled">false</item>: 背景是否模糊显示 <!--操作类--> <item name="windowCloseOnTouchOutside">false</item><!--点击窗体外,是否消失--> </style>
2.当设定好主题后, 我们可以在 自己的dilaog 中 自定义View 来实现相关弹窗(这里的inflate 有三种写法,这里只写一种).
LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.dialog_base, null); baseDialog.setContentView(v);
要注意的是,在这里的view 中 ,在设置边框的时候,可能有些边框之类的,不会被显示,那还是得在你的view 中添加好margin,才会显示.
3.第三步,需要在代码里来进行相关设定(包括第二步的内容), 在我们 写项目中 dialog 要在utils 类中新建一个专门的类方便进行管理.我用类名DialogFactory, 在这里面写上方法
良好的封装,能够让代码得到重复利用~
public static Dialog createBaseCustomDialog(Context context, String title, String text, View.OnClickListener onClickListener) { Dialog baseDialog = new Dialog(context, R.style.default_dialog_style); LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.dialog_base, null); baseDialog.setContentView(v); TextView titleTv = (TextView) v.findViewById(R.id.dialog_base_title_tv); TextView textTv = (TextView) v.findViewById(R.id.dialog_base_text_tv); Button confirmBtn = (Button) v.findViewById(R.id.dialog_base_confirm_btn); titleTv.setText(title); textTv.setText(text); confirmBtn.setOnClickListener(onClickListener);//将监听放在外面实现 baseDialog.setCancelable(false);//是否删除 return baseDialog; }
ps :这里,dialog 的样式,alertDialog 样式都能修改.样式的问题,需要根据需求去改变,功能上的需求 基本上都能实现. 自定义dialog,个人感觉没有什么意义.