DialogFramgment:结合Dialog与Fragment的一种界面
初始化UI和填充数据时与Fragment类似
调用则是基于Dialog
DialogFragment.show()是用来在Activity中显示时调用的
DialogFragment.dismiss()方法为关闭
在之前的项目中,开发用该Fragment充当购买时选择规格的界面,需要考虑的是:Activity不销毁的情况下,如何保存上一次在DialogFramgment选中的规格.经过查找源码和翻阅资料,基于Dialog和Fragment的特性有了如下代码
if(buyDialogFragment==null){
buyDialogFragment=new GoodsBuyDialogFragment().setGoodsEntity(goodEntity).setBuyType(true);
buyDialogFragment.show(getActivity().getSupportFragmentManager(), TAG);
}else{
buyDialogFragment.setBuyType(true);
buyDialogFragment.onStart();
}
首先需要记录DialogFramgent对象的内存地址,然后根据是否有该DialogFramgent对象去判断采用何种方式调用
DialogFragment中可以通过Fragment.onStart(),Fragment.onStop()去操控Dialog的显示或隐藏。并且不会导致Fragment被销毁,如下图所示:
在布局文件中,需要让你的组件覆盖整个屏幕,如下图所示:
因为Dialog默认当点击在空白位置时,会调用Dialog.dismiss()方法,而DialogFragment有设置Dialog.dismiss的回调,会导致DialoFragment.dismissInternal()方法被触发。之后再调用Framgent.onStart()将会抛出空指针异常
Dialog除了点击空白地方会调用Dialog.dismiss()方法外,当点击返回键时也会触发Dialog.dismiss()方法
所以还需要在你的DialogFragment负责初始化的方法中添加如下代码
getDialog().setOnKeyListener(this);
以及把复写的OnKeyListener.onkey()方法修改为如下代码:
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
onStop();
return true;
}
return false;
}
原理如下:
在Dialog.dispatchKeyEvent()方法中会回调OnKeyListener.onKey()方法,以便于让开发者自定义Dialog的按键监听
大家有没有注意到文中的buyDialogFragment.setBuyType(true);
这行代码代表的是每次显示DialogFragment时,必须由Activity控制的DailogFragment界面组件。
例:商品详情界面,点击添加购物车或点击立即购物,DialogFragment上的按钮也要随之变化
那么在DialogFragment中何时变化呢?请看下图:
因为是公司的项目,很抱歉整体的代码不能传给大家,如果有疑问的话,欢迎在下方评论