关于安卓DialogFragment使用(三)

简介: 关于安卓DialogFragment使用(三)

本文将介绍dialog fragment在使用过程中反复出现的问题。

当使用dialog fragment时,在重写了getDialog的dismiss的监听时。取消弹窗,退出页面,重新进入,会导致dialogfragment重新出现。

通过排查发现,若代码中主动调用了dismiss,则不会出现该bug,否则会出现这种情况。

对于出现这种情况的原因,可以追查源码发现如下:
(一)首先,观察setOnDismissListener是一个单对象监听,换而言之,重写会进行覆盖。

    /**
     * Set a listener to be invoked when the dialog is dismissed.
     * @param listener The {@link DialogInterface.OnDismissListener} to use.
     */
    public void setOnDismissListener(@Nullable OnDismissListener listener) {
        if (mCancelAndDismissTaken != null) {
            throw new IllegalStateException(
                    "OnDismissListener is already taken by "
                    + mCancelAndDismissTaken + " and can not be replaced.");
        }
        if (listener != null) {
            mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);
        } else {
            mDismissMessage = null;
        }
    }

(二)第二,追查dialogfragment的源码,发现有以下代码:

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (!mShowsDialog) {
            return;
        }

        View view = getView();
        if (view != null) {
            if (view.getParent() != null) {
                throw new IllegalStateException(
                        "DialogFragment can not be attached to a container view");
            }
            mDialog.setContentView(view);
        }
        final Activity activity = getActivity();
        if (activity != null) {
            mDialog.setOwnerActivity(activity);
        }
        mDialog.setCancelable(mCancelable);
        mDialog.setOnCancelListener(this);
        mDialog.setOnDismissListener(this);
        if (savedInstanceState != null) {
            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
            if (dialogState != null) {
                mDialog.onRestoreInstanceState(dialogState);
            }
        }
    }

发现在onActivityCreated方法中,会调用一次setOnDismissListener。假如我们重写的基类中,且在onActivityCreated生命周期后,通过getDialog()方法重写了setOnDismissListener,那么原始的dialog定义好的setOnDismissListener就会失效,导致文章开始说的bug出现。

这里解决方法有很多,提供一下思路:
(一)如果外部一定要设置dialog的setOnDismissListener监听,这个时候,需要在该方法内,调用一次dismiss()方法确保dialog fragment真正走了"消失"的方法。
(二)子类重写onDismiss()方法,该方法是DialogInterface.OnDismissListener的实现方法,当dialog取消的时候,会进行回调。
总的来所,推荐使用第二种方法,能减少意外情况发生。

that's all--------------------------------------------------------------------------------------

目录
相关文章
|
3月前
|
XML Android开发 数据格式
Android面试题之DialogFragment中隐藏导航栏
在Android中展示全屏`DialogFragment`并隐藏状态栏和导航栏,可通过设置系统UI标志实现。 记得在布局文件中添加内容,并使用`show()`方法显示`DialogFragment`。
50 2
|
Android开发
Android DialogFragment 的封装
Android DialogFragment 的封装
Android DialogFragment 的封装
|
Android开发
关于安卓底部dialogfragment封装
关于安卓底部dialogfragment封装
355 0
|
Android开发
关于安卓DialogFragment基类封装
安卓DialogFragment基类封装
176 0
|
Android开发 容器
Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题
我的上一篇文章:设置DialogFragment全屏显示 可以设置对话框的内容全屏显示,但是存在在某些机型上顶部的View被状态栏遮住的问题。经过测试,发现了一种解决办法,在DialogFragment的onCreateView()中添加一个布局监听器: @Override public View.
2436 0
|
Android开发 uml 容器
Android基于DialogFragment封装一个通用的Dialog
1、内置Dialog常用默认的样式,内置样式可自行修改 2、支持自定义复杂的布局、动画、对话框大小、背景色等设 3、统一管理多个dialog并顺序弹出
6112 0
|
Android开发 容器
Android中DialogFragment优于Dialog
首先DialogFragment是跟随Fragment一起被Google推出的,DialogFragment是基于Fragment的,生命周期和Fragment是一样的。
1277 0
|
Android开发 容器 数据格式
Android DialogFragment使用
1. 简单使用 继承DialogFragment /** * 显示系统的对话框Fragment * @author mazaiting * @date 2018/3/1 */ public class CustomDialogFragm...
1100 0
下一篇
无影云桌面