美文网首页
FragmentDialog

FragmentDialog

作者: xandone | 来源:发表于2018-04-13 14:15 被阅读259次

    FragmentDialog继承自v4包的Fragment
    便于管理Dialog的生命周期
    原理:
    1.可以看出内部实现还是用的Dialog,Fragment的作用只是便于管理Dialog的生命周期,状态数值等
    2.Dialog的初始化

     mDialog = onCreateDialog(savedInstanceState);
     
         @NonNull
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            return new Dialog(getActivity(), getTheme());
        }
    2.Dialog的显示
        @Override
        public void onStart() {
            super.onStart();
    
            if (mDialog != null) {
                mViewDestroyed = false;
                mDialog.show();
            }
        }
    

    可见,当FragmentDialog处于onStart状态时候,dialog就显示了,可以简单理解为fragment显示的时候带出了个dialog
    3.Dialog的隐藏

        @Override
        public void onStop() {
            super.onStop();
            if (mDialog != null) {
                mDialog.hide();
            }
        }
    

    4.Dialog的销毁

    @Override
        public void onDestroyView() {
            super.onDestroyView();
            if (mDialog != null) {
                // Set removed here because this dismissal is just to hide
                // the dialog -- we don't want this to cause the fragment to
                // actually be removed.
                mViewDestroyed = true;
                mDialog.dismiss();
                mDialog = null;
            }
        }
    

    5.异常情况下的状态保存

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            if (mDialog != null) {
                Bundle dialogState = mDialog.onSaveInstanceState();
                if (dialogState != null) {
                    outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
                }
            }
            if (mStyle != STYLE_NORMAL) {
                outState.putInt(SAVED_STYLE, mStyle);
            }
            if (mTheme != 0) {
                outState.putInt(SAVED_THEME, mTheme);
            }
            if (!mCancelable) {
                outState.putBoolean(SAVED_CANCELABLE, mCancelable);
            }
            if (!mShowsDialog) {
                outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
            }
            if (mBackStackId != -1) {
                outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
            }
        }
    

    6.状态的恢复

     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);
            }
    

    7.手动销毁FragmentDialog

        void dismissInternal(boolean allowStateLoss) {
            if (mDismissed) {
                return;
            }
            mDismissed = true;
            mShownByMe = false;
            if (mDialog != null) {
                mDialog.dismiss();
                mDialog = null;
            }
            mViewDestroyed = true;
            if (mBackStackId >= 0) {
                getFragmentManager().popBackStack(mBackStackId,
                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
                mBackStackId = -1;
            } else {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.remove(this);
                if (allowStateLoss) {
                    ft.commitAllowingStateLoss();
                } else {
                    ft.commit();
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:FragmentDialog

          本文链接:https://www.haomeiwen.com/subject/jhmckftx.html