DialogFragment 意义
-
它和
Fragment
基本一致的生命周期,因此便于Activity
更好的控制管理DialogFragment
。 -
随屏幕旋转(横竖屏幕切换)
DialogFragment
对话框随之自动调整对话框大小。AlertDialog
和PopupWindow
随屏幕切换而消失,并且如果处理不当很可能引发异常。 -
DialogFragment
的出现完美的解决了横竖屏幕切换Dialog
消失的问题。
如何使用DialogFragment
有两种方法
实现onCreateDialog方法
通过继承
DialogFragment
并且实现它的
onCreateDialog(Bundle savedInstanceState)
方法来创建一个
DialogFragment
,这个方法返回的是一个
Dialog
,意味着我们需要创建一个
AlertDialog
,并返回。
public class LoginDialogFragment extends DialogFragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.fragment_login_dialog, null);
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(view)
// Add action buttons
.setPositiveButton("Sign in",
new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int id)
}).setNegativeButton("Cancel", null);
return builder.create();
}
实现onCreateView方法
通过继承
DialogFragment
并且实现它的
onCreateView(LayoutInflater, ViewGroup, Bundle)
这个方法来加载一个我们指定的
xml
布局从而提供对话框内容。
public class EditNameDialogFragment extends DialogFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(R.layout.fragment_edit_name, container);
return view;
}
【注】以上两种方法创建对话框时候只能使用其中一种,不能两个同时使用。
DialogFragment宽高设置无效
DialogFragment
在
onCreate()
和
onCreateView()
中设置布局大小无效,因为
onCreate()
和
onCreateView()
生命周期在
onStart()
生命周期之前,此时还未调用
Dialog.show()
方法,设置大小无效。所以要在
onStart
方法中设置大小;
/**
* 修改布局的大小
@Override
public void onStart() {
super.onStart();
resizeDialogFragment();
private void resizeDialogFragment() {
Dialog dialog = getDialog();
if (null != dialog) {
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = getDialog().getWindow().getAttributes();
lp.height = (25 * ScreenUtil.getScreenHeight(getContext()) / 32);//获取屏幕的宽度,定义自己的宽度
lp.width = (8 * ScreenUtil.getScreenWidth(getContext()) / 9);
if (window != null) {