Android UI总结三 弹出框的设计

本文介绍了Android中弹出框的几种实现形式,包括Dialog和AlertDialog、PopUpWindow、DialogFragment等,分析了它们的特点。还阐述了通用弹框的实现,涉及使用的设计模式(如builder模式)、需考虑的参数及参数传递方式等信息技术相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.弹出框实现的几种形式

1.Dialog和AlertDialog

在Android3.0之前系统提供的控件。注:官方不推荐直接使用Dialog创建对话框。传统的new AlertDialog在屏幕旋转时,第一不会保存用户输入的值,第二还会报异常,因为Activity销毁前不允许对话框未关闭。而通过DialogFragment实现的对话框则可以完全不必考虑旋转的问题。

AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;

1.Dialog在显示之前不需要设置宽高。

2.Dialog响应系统的back事件,在点击back的时候dialog会消失

3.Dialog会给弹出的背景加蒙层

4.Dialog默认设有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)取消标题

5.Dialog显示需要加grarity,如果不设置,Dialog默认是Gravity.CENTER。

6.Dialog显示有默认背景,可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。

2.PopUpWindow

1.PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。

2.PopupWindow有默认背景,可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent))去掉。

3.PopupWindow显示的时候需要设置Gravity

4.PopupWindow没有标题

5.PopupWindow不会添加蒙层

6.PopupWindow显示前需要设置宽和高

7.Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);

 

2.DialogFragment

DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。

使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。

 

4.基于R.id.content的添加view

 

5.基于Window Manager实现

 

二.下载地址

 

三.视频地址

 

四.弹出框的实现

 

五.通用弹框的实现

1.使用到的设计模式

builder模式 对于参数传递的封装

2.一般需要考虑的参数

title

显示位置

显示框大小

是否需要背景

是否需要左右按钮 左右按钮的事件回传

我们自己的view的传递

圆角的适配问题

是否相应点击back键 

是否响应点击背景等

3.参数的传递方式

builder设计模式有利于清晰明了的知道传递的参数

4.

一个通用的Android窗管理框架,内部维护窗优先级队列 具备窗管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务窗逻辑所困扰如何添加依赖只需要两行代码轻松接入//add this to your repositories  maven { url 'https://www.jitpack.io' } //add this to your dependencies implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'具体如何使用1.根据策略创建对应的view//Dialog形式 PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app); //透明Webview形式 PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);2.开始装配窗配置Popi mUpgradePopi1 = new Popi.Builder()                 .setmPopId(4)//窗的唯一标识 当id发生改变 视为新的窗                 .setmPriority(2)//优先级这里不具体划分对应的范围 值越小优先级越高                 .setmCancelType(TRIGGER_CANCEL)//窗消失的类型分为 TRIGGER_CANCEL(触摸消失) COUNTDOWN_CANCEL (延时消失)                 .setMaxShowTimeLength(5)//最长显示时间(S)                 .setMaxShowCount(5)//最大显示次数                 .setmBeginDate(1548858028)//开始时间 2019-01-30 22:20:28                 .setmEndDate(1548944428)//结束时间 2019-01-31 22:20:28                 .setLayerView(mLayerView)//View                 .build();3.纳入窗管理//纳入窗管理 PopManager.getInstance().pushToQueue(mUpgradePopi); //开始显示窗 PopManager.getInstance().showNextPopi();效果预览未来的计划逐步统一 其他类型的窗 希望能提供给大家一个较为全面的应对业务需求的窗管理框架版本记录V1方案版本号LOG进度更新V1.0.0项目开源,完成窗管理与Dialog形式扩展Dialog策略扩展完成V1.0.1修复Dialog策略无法获取dialog实体bugDialog策略优化V1.0.2修复activity摧毁造成的窗异常 bugDialog策略优化V1.0.3优化了窗的使用更加方便快捷框架使用优化V2方案版本号LOG进度更新V2.0.0正式加入透明Webview窗策略扩展透明Webview策略扩展完成作者介绍Hello 我叫lalala,如果您喜欢这个项目 请给个star 能follow我那真是太好了!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值