android的弹框大概有:PopupWindow,Dialog,DialogFragment
Android官方推荐使用DialogFragment来代替传统的Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性,
主要是继承Fragment的优点和缺点:
优点:fragment的生命周期管理和碎片化
缺点:fragment的一些坑,参考传送门
PopupWindow更合适相对控件位置弹出,更容易设置指定显示的位置,网上说:
Dialog是非阻塞式对话框,而PopupWindow是阻塞式对话框,
这里我使用时候发现,就算PopupWindow弹出来了,后续toast和dialog还能弹出来,当前页面的其他控件也能响应
PopupWindow能不能屏蔽屏幕的点击事件,主要是如下设置:
1 | // 设置popupWindow获得焦点 |
关于PopupWindow,会另开一篇,接下来写一些简单的DialogFragment封装:
1 | public class BaseDialogFragment extends DialogFragment { |
这里通过dialogName来标识dialog的唯一性,避免创建多种相同的dialog。
使用commitAllowingStateLoss()方法提交,避免产生异常:Can not perform this action after onSaveInstanceState
但是这样也放弃了fragment状态的恢复。该异常产生的原因:在你离开当前Activity等情况下,
系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,
直到再回到该Activity之前(onResume()之前),你执行Fragment事务,
就会抛出该异常!(一般是其他Activity的回调让当前页面执行事务的情况,会引发该问题)
具体的Dialog:
1 | public class LoadingDialog extends Dialog { |
可以看到dialog和DialogFragment是很分离的,感觉像是套了一层,dialog也可以直接使用。