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


在最近写的项目中,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><!--DialogwindowFrame框为无-->
    <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,个人感觉没有什么意义.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值