Dialog 基础篇
个人觉得一个app在设计阶段应该少用对话框,动不动就弹一个对话框,体验超级不好的,无奈,产品非要啊。能怎么办呢,
所以我不定时更新一些dialog的小笔记,希望你遇到的坑我这里都有。
Dialog是对话框的基类,不应该实例化这个,而是使用他的子类
一、Dialog的子类
1、AlertDialog
AlertDialog是最普通的对话框,可以显示标标题,最多三个按钮、可选择列表或者自定义布局。
2、DatePickerDialog和TimePickerDialog
这种对话框允许用户选择日期或时间的预定义UI
3、ProgressDialog
这种对话框是具有进度条的,不过,如需指示加载进度或不确定的进度,则应改为遵循进度和activity的设计指南,并在布局中使用ProgressBar
二、对话框的基本使用规则
1、8种Dialog对话框的使用方法(普通(包含提示消息和按钮)、列表、单选、多选、等待、进度条、编辑、自定义)
2、
如果我们希望在对话框创建或者关闭时完成一些特定的功能,这需要复写Dialog的create(),show()、diamiss()等方法
1、基本使用
需要我们做的步骤有
1.setView(View view) ,用LayoutInflater(this).inflate(R.layout.XX,null)加载定义好的布局view传入参数。\\ 自定义布局
2.setTitle \\设置标题
3.setMessage \\ 设置中间的消息内容
4.setPositiveButton \\ button1设置按钮事件,要传入名字,事件监听回调等
5.setNegativeButton \\ button2 同上
自定义dialog ,需要new一个dialog继承AlertDialog.Builder,可以修改两个参数的构造函数,传入自定义的style,
然后用LayoutInflate.from(this).inflate(R.layout.xx,null)加载dialog的布局等。
2、补充说明
2.1对话框的大小设定:
2.1.1
通过WindowManager.LayoutParemes来设置,通过设置宽、高来改变Dialog的宽高
。
dialog.setContentView(R.layout.XX);
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();
dialogWindowAttributes .width = 400;
dialogWindowAttributes .height =400;
dialogWindow.setAttributes(dialog_window_attributes);
dialog.show();
2.1.2 通过自定义布局来设置dialog的的大小
xml省略
自定义对话框的位置,也是通过Gravity和WindowManage.params来设置的
Window dialog_window =dialog.getWindow();
dialog_window.setGravity(Gravity.TOP|Gravity.LEFT);
WindowManager.LayoutParams dialog_window_attributes = dialog_window.getAttribute();
//设置偏移量
dialog_window_attributes.setAttribute.x=50;
dialog_window_attributes.setAttribute.y=50;
2.2dialog的style一些属性:
<style name="myDialog">
<!--设置dialog的头部不显示-->
<item name="android:windowNoTitle">true</item>
<!--设置对话框的背景颜色-->
<item name="android:background">@color/colorPrimary</item>
<!--是否允许对话框变暗-->
<item name="android:backgroundDimEnabled">false</item>
<!--对话框的背景变暗程度,值越大,背景越暗-->
<item name="android:backgroundDimAmount">1.0</item>
<!--dialog的动画效果-->
<!--<item name="android:windowAnimationStyle"></item>-->
<!--设置dialog的背景色-->
<!--<item name="android:windowBackground">@color/colorAccent</item>-->
<!--是否浮动在activity前-->
<item name="android:windowIsFloating">true</item>
</style>
<style name="dialog_animation">
<item name="android:windowEnterAnimation">dialog_enter</item>
</style>
3、修改默认的三个按钮的style
这三个按钮是系统已经设置好的,边距,大小,字体颜色,背景等;
所以当我们有需求修改时:
1、getButton()
在setOnShowListener的onShow中修改,否则会get 为null
缺点:系统自带的最多三个按钮
2、不采用系统的按钮
直接自定义对话框,setView。
优点:操作简单,在xml中定义,想要几个按钮就几个。
4、点击对话框外界不消失
1、setCanceledOnTouchOutside(false)
传入false表示点击别处不可以dismiss;击物理返回键会消失
注意:这个要在onShow之后才会生效
2、setCancelable(false)
传入false表示点击别处不可以dismiss,并且点击物理返回键也不消失
5、点击系统按钮之后不消失
场景:按钮有删除键,输入密码确认键,如果密码正确则消失,不正确不消失。
方法:
1、添加标志位
![](https://i-blog.csdnimg.cn/blog_migrate/7235e824a164e4d42253cd0e73049ab1.png)
2、重写dismiss方法
![](https://i-blog.csdnimg.cn/blog_migrate/3d20df8babb8d52965616da1761096f5.png)
在点击delete键时,将mIsAllowDismiss设置为false,点击完成之后,系统会调用dismiss
将mShowing(这是一个Dialog的变量,判断是否显示对话框的变量)设置为false,采用一种欺骗的手段让系统以为对话框已经消失了。
3、关键技术
Field field = dialog.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
// 采用反射 获得Dialog中的mShowing
field.setAccessible(true);
field.set(dialog, allow);
注意:每次执行完要讲mShow设置回原来的值,不然会引入其他问题
![](https://i-blog.csdnimg.cn/blog_migrate/03d1c62d46ad12fc8c2cdc7dc3e47e55.png)