将一个Activity作为一个Dialog展示
<activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" >
注意点
系统自己调用onDismiss时会走onCancel()方法,但是用户调用Dialog.dismiss() or DialogFragment.dismiss()时,系统不会在onCancel()方法,所以一般在用户点击可积极按钮时,用户才调用Dialog.dismiss,用于移除Dialog
Dialog设置响应事件时
nClick的参数中有一个which,这个是什么意思呢?这个which实际上代表的是一个唯一的int型数值。像上面的setPositiveButton中的which代表的是-1,setNegativeButton中的which代表的是-3,setNeutralButton中的which代表的是-2。
Dialog创建对话框时,如何去除标题
方法一:
可以在onCreateView中调用getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);即可去掉。
方法二:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* setStyle() 的第一个参数有四个可选值:
* STYLE_NORMAL|STYLE_NO_TITLE|STYLE_NO_FRAME|STYLE_NO_INPUT
* 其中 STYLE_NO_TITLE 和 STYLE_NO_FRAME 可以关闭标题栏
* 每一个参数的详细用途可以直接看 Android 源码的说明
*/
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog);
}
数据的保存
传统的new AlertDialog在屏幕旋转时,第一不会保存用户输入的值,第二还会报异常,因为Activity销毁前不允许对话框未关闭。而通过DialogFragment实现的对话框则可以完全不必考虑旋转的问题。
处理屏幕翻转
如果使用传统的 Dialog ,需要我们手动处理屏幕翻转的情况,但使用 DialogFragment 的话,则不需要我们进行任何处理,FragmentManager 会自动管理 DialogFragment 的生命周期。
实现全屏(宽/高度全屏)
常见的形式大多是宽度上和屏幕一样宽,高度自适应
方法一
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.fragment_dialog, null);
Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
dialog.setCanceledOnTouchOutside(true);
//Do something
// 设置宽度为屏宽、位置靠近屏幕底部
Window window = dialog.getWindow();
//设置了窗口的背景色为透明,这一步是必须的;
window.setBackgroundDrawableResource(R.color.transparent);
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
//设置窗口的宽度为 MATCH_PARENT,效果是和屏幕宽度一样大,同样你也可以设置高度的值。设置宽度和高度除了 MATCH_PARENT 和 WRAP_CONTENT ,也可以直接设置成具体的数值。
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
return dialog;
}
方法二
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getDialog().setCanceledOnTouchOutside(true);
View rootView = inflater.inflate(R.layout.fragment_dialog, container, false);
//Do something
// 设置宽度为屏宽、靠近屏幕底部。
final Window window = getDialog().getWindow();
//设置窗口的背景色为透明
window.setBackgroundDrawableResource(R.color.transparent);
//设置窗口的Padding值全部为0
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
return rootView;
}
使用DialogFragment管理对话框
使用DialogFragment来管理对话框,至少需要实现onCreateView或者onCreateDialog方法。onCreateView即使用定义的xml布局文件展示Dialog