接上篇,继续:
然后就是setShowsDialog(boolean showsDialog)方法。官方文档是这样解释的:控制DialogFragment是否是一个dislog,如果设置为false,则没有dialog被创建出来,你可以把它当做一个普通的Fragemnt使用。
开头提到了,mShowsDialog默认为true,所以如果你把DialogFragment确实作为一个Dialog使用,那大可不必调这个方法。当我看到OnCreate的方法时,就更加确定。(官方文档上说了一种情况,需要手动调用它,这种情况及其少见,有兴趣的可以自行去研究)。
public void setShowsDialog(boolean showsDialog) {
mShowsDialog = showsDialog;
}
来看onCreate方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mShowsDialog = mContainerId == 0;
if (savedInstanceState != null) {
mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
}
}
mShowsDialog = mContainerId == 0;
没错,默认情况下,mContainerId就是0,所以mShowsDialog自然就是true;而当你在把它当成Fragment使用时,会为其指定xml布局中位置,所以,mContainerId也会不为0,所以mShowsDialog自然就是false。
然后是LayoutInflater getLayoutInflater(Bundle savedInstanceState),这个方法被hide了,所以外部是调不到的。
简单说一下这个getLayoutInflater方法,它的调用点是在onCreateView的时候,从先后顺序来说getLayoutInflater在onCreateView之前。
摘自FragmentManager:
f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),null, f.mSavedFragmentState);
getLayoutInflater方法如下:
/** @hide */
@Override
public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
if (!mShowsDialog) {
return super.getLayoutInflater(savedInstanceState);
}
mDialog = onCreateDialog(savedInstanceState);
switch (mStyle) {
case STYLE_NO_INPUT:
mDialog.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
// fall through...
case STYLE_NO_FRAME:
case STYLE_NO_TITLE:
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
if (mDialog != null) {
return (LayoutInflater) mDialog.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
return (LayoutInflater) mActivity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
如果不是Dialog,则调用Fragment自身的方法;否则,就先创建一个dialog,然后,根据之前设置的style,对dialog赋值。所以,
setStyle这个方法调用,一定要在onCreateView之前。一般来讲,都会放到onCreate中调用。
STYLE_NO_FRAME和STYLE_NO_TITLE都调用了mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
那它们两个参数有什么不同呢,答案就在开头setStyle中,STYLE_NO_FRAME会再没有theme的情况下,设置theme为android.R.style.Theme_Panel。
然后就是onCreateDialog方法,你可以重写这个方法,创建一个自己定义好的dialog。默认情况下,会自己创建一个Dialog。
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), getTheme());
}
再说一个onDismiss方法,没错,它是DialogInterface.OnDismissListener中的方法,DialogFragment实现了它。所以,在dialog不显示后,会回调这个方法,然后再去调用自己的dismissInternal方法:
public void onDismiss(DialogInterface dialog) {
if (!mViewDestroyed) {
dismissInternal(true);
}
}
那么,dialog什么时候显示出来?是在OnStart的时候:
@Override
public void onStart() {
super.onStart();
if (mDialog != null) {
mViewDestroyed = false;
mDialog.show();
}
}
而与其对应的生命周期方法onStop()时,则是将其先隐藏了。
@Override
public void onStop() {
super.onStop();
if (mDialog != null) {
mDialog.hide();
}
}
最后就是onDestroyView方法,它会将dialog销毁。
@Override
public void onDestroyView() {
super.onDestroyView();
if (mDialog != null) {
mViewDestroyed = true;
mDialog.dismiss();
mDialog = null;
}
}
好了,以上就是DialogFragment源码部分。
小结:
1、DialogFragment本质上说就是Fragment,只是其内部还有一个dialog而已。你既可以当它是Dialog使用,也可以把它作为Fragment使用。
2、setStyle中,style的参数是不可以相互一起使用的,只能用一个,如果还不满足你使用,可以通过设置theme来满足。
3、setStyle的调用点,要放在onCreateView前,否则,设置的style和theme将不起作用!
分享到:
相关推荐
类似PopupWindow的弹框DialogFragment实现TabLayout+ViewPager多个Fragment左右滑动切换
相关博客:【android学习开源项目之AndroidAutoSize】AndroidAutoSize和DialogFragment的适配 https://blog.csdn.net/ljb568838953/article/details/103906449; 本demo的知识点:1.AndroidAutoSize 的使用(今日...
blog原文 http://blog.csdn.net/qiaoidea/article/details/46402845 讲解分析 Dialog 和DialogFragment
本文实例讲述了Android开发之DialogFragment用法。分享给大家供大家参考,具体如下: 背景 Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的...
关于详解Android应用中DialogFragment的基本用法,大家可以参考下。 1、 概述 DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框...
使用建造者模式、dialogfragment、recycleView自定义列表式的dialog
博客地址:http://blog.csdn.net/krubo1/article/details/50462048
Android DialogFragment的使用方法 ,google官方推荐使用DialogFragment代替Dialog. 具体的详细解释可以在我的博客http://blog.csdn.net/a253664942/article/details/45585661中看看,有问题的可以我给留言!
DialogFragment实现底部弹窗 DialogFragment底部弹窗的开发模板,Created by C.L. Wang
android 自定义dialogfragment全屏对话窗体,这个demo还是很棒的。值得学习,直接用在项目里。
Android弹窗实现之Popupwindow及DialogFragment。创建并实现PopupWindow布局 实现PopupWindow对象实例 设置PopupWindow背景、动画属性、控件实现及事件监听 显示PopupWindow及位置设定。
android当中DialogFragment的简单使用,配合博客的代码
android-dialogfragment Android DialogFragment 示例
DialogFragment的基本用法 1. 创建DialogFragment public class DialogA extends DialogFragment implements DialogInterface.OnClickListener { @Override public Dialog onCreateDialog(Bundle ...
本实例尽量做到实现该功能的最小实例,换句话说就是,尽量去掉与实现该功能无法的代码从而使我们更容易的看到实现该功能的核心。
Android中基于DialogFragment实现的Dialog提示功能,附加了nice的动画效果。
Android很好用的确认对话框(DialogFragment)
react native 弹出框,类似android的DialogFragment