前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DialogFragment 使用

DialogFragment 使用

作者头像
Yif
发布2019-12-26 14:59:28
1.6K0
发布2019-12-26 14:59:28
举报
文章被收录于专栏:Android 进阶Android 进阶

DialogFragment 意义

  1. 它和Fragment基本一致的生命周期,因此便于Activity更好的控制管理DialogFragment
  2. 随屏幕旋转(横竖屏幕切换)DialogFragment对话框随之自动调整对话框大小。AlertDialogPopupWindow随屏幕切换而消失,并且如果处理不当很可能引发异常。
  3. DialogFragment的出现完美的解决了横竖屏幕切换Dialog消失的问题。

如何使用DialogFragment

有两种方法

实现onCreateDialog方法

通过继承DialogFragment并且实现它的onCreateDialog(Bundle savedInstanceState)方法来创建一个DialogFragment,这个方法返回的是一个Dialog,意味着我们需要创建一个AlertDialog,并返回。

代码语言:javascript
复制
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布局从而提供对话框内容。

代码语言:javascript
复制
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宽高设置无效

DialogFragmentonCreate()onCreateView()中设置布局大小无效,因为onCreate()onCreateView()生命周期在onStart()生命周期之前,此时还未调用Dialog.show()方法,设置大小无效。所以要在onStart方法中设置大小;

代码语言:javascript
复制
/**
* 修改布局的大小
*/
@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) {
window.setLayout(lp.width, lp.height);
}
}
}

DialogFragment消失操作

  1. DialogFragment在正常Dismiss后并不会直接从当前的栈中移除,而是在DialogFragment中的onDestroyView()回调时,才会对DialogFragment进行出栈操作,所以如果你如果需要在Activity中频繁的显示隐藏一个DialogFragment,那么在dismiss时需要手动的调用dismissAllowingStateLoss()方法,并且再次show时不能用上一个DialogFragment实例。
  2. DialogFragment并没有对Dialog的消失提供监听给调用者使用,但是我们通过源码分析得知,DialogFragmentonActivityCreate当中其实已经帮我们设置了onDismissListener,所以我们如果需要对Dialog的消失进行监听的话只需重写onDismiss方法即可,还有一种方式则是覆盖父类设置的onDismissListener监听,但是需注意的时,这个监听的复写,必须在父类onActivityCreate方法调用之后。

关于消失监听的两种写法如下:

  1. mListener为提供到外部使用的回调 @Overridepublic void onDismiss(DialogInterface dialog) {      super.onDismiss(dialog); mListener.onDismiss(dialog); Logger.d(TAG, "onDismiss");     }  
  2. 复写setOnDismissListener必须发生在父类的onActivityCreate之后 @Overridepublic void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getDialog() != null && null != mListener) { getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() { @Overridepublic void onDismiss(DialogInterface dialog) { ToastUtils.showToast("覆盖后的OnDismiss Listener"); } }); }      Logger.d(TAG, "onActivityCreated"); }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年7月17日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DialogFragment 意义
  • 如何使用DialogFragment
    • 实现onCreateDialog方法
      • 实现onCreateView方法
      • DialogFragment宽高设置无效
      • DialogFragment消失操作
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档