DialogFragment 在API3.0 之后引入,官方推荐使用DialogFragment来代替Dialog
优点:
(1)方便管理。因为DialogFragment本身也是继承Fragment类,所以具有Fragment的生命周期。
(2)保存Dialog状态。旋转屏幕的时候屏幕会重绘导致Dialog消失,利用Fragment的生命周期回调保存Dialog的信息。
(3)定制Dialog样式更加方便。
下面我们来看看怎样使用DialogFragment
有两种方式:
(1)继承DialogFragment并且实现它的onCreateDialog(Bundle savedInstanceState)方法
这种方法需要在onCreateDialog 方法中新建一个Dialog,并返回。
(2)继承DialogFragment并且实现它的onCreateView(LayoutInflater, ViewGroup, Bundle) 方法
这种方法只需要获取Dialog的布局返回,这种方式简单,避免了Dialog的一些坑(这里的坑指的是Dialog里面有些API设置自定义的View时无法调出输入法,显示不出来等等)。
下面展示第一种方式的简单代码
public class MyDialogFragment extends DialogFragment {
/**
* 新建实例
*
* @return
*/
public static MyDialogFragment init() {
MyDialogFragment myDialogFragment = new MyDialogFragment();
return myDialogFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity()).setTitle("Title").setMessage("onCreateDialog")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
}).setNegativeButton("取消", null)
.create();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
/**
* 最后调用,显示对话框
*
* @param manager
* @return
*/
public MyDialogFragment show(FragmentManager manager) {
super.show(manager, String.valueOf(System.currentTimeMillis()));
return this;
}
}
调用的时候只需要
MyDialogFragment.init()
.show(getSupportFragmentManager());
当然也可以在onCreateDialog方法中设置事件监听,初始化视图等等。
再来看看第二种方式(这里只展示一部分关键代码):
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_custom, container, false);
视图初始化,事件监听
...
return view;
}
看到这里已经讲完DialogFragment的使用方法了,是不是很简单。如果想要定制属于自己的好看的Dialog样式还是需要详细设计的,下面我们来看看怎样定制高灵活性的DialogFragment。
首先我们来参考两个Dialog的开源库,效果还是不错的
包含几种样式,错误,警告,成功,普通,继承Dialog。
继承DialogFragment实现,可设置各种视图布局。
两个开源库各有优点,现在把它们集成到一起实现带生命周期和高度可定制性的Dialog。
GitHub地址:https://github.com/StarsAaron/ApplicationTemplate/tree/master/customdialoglibrary
展示的Activity:点击打开链接
简单的对话框
CustomDialog.init()
.setTitleText("Title")// 标题
.setContentText("Something!") // 内容
.setDimAmount(0.3f)//背景透明度
.setWidth(WindowManager.LayoutParams.WRAP_CONTENT)//宽度为包裹内容
.setOutCancel(true)//点击对话框外区域消失
.show(getSupportFragmentManager());//显示
如果要设置自定义的布局只需要在init方法中传入DialogType.CUSTOM_VIEW_TYPE参数,调用setLayoutId 设置布局文件,在setConvertListener 中绑定布局控件,添加事件监听等。
CustomDialog.init(CustomDialog.DialogType.CUSTOM_VIEW_TYPE)
.setLayoutId(R.layout.share_layout)
.setConvertListener(new CustomDialog.ViewConvertListener() {
@Override
public void convertView(ViewHolder holder, final CustomDialog customDialog) {
holder.setOnClickListener(R.id.wechat, new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(CustomDialogTestActivity.this, "分享成功", Toast.LENGTH_SHORT).show();
}
});
}
})
.setDimAmount(0.3f)
.setShowBottom(true)// 在底部显示
.show(getSupportFragmentManager());
详细的代码请看GitHub源码,使用的时候直接导入customdialoglibrary进工程就可以了。