您的位置:首页 > Web前端 > CSS

Andorid 项目中Dialog的便捷开发,全面的样式选择.

2016-05-24 15:12 411 查看
在最近写的项目中,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,个人感觉没有什么意义.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: