DialogFragment 写 setRetainInstance(true);activity重建后不能保持弹出的原因

在DialogFragment 的子类中,调用

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 保存整个实例
        setRetainInstance(true);
    }

期望结果是 弹出dialog,在屏幕旋转后,保持弹出状态,
但是未弹出,原因是

Dialog

 public void dismiss() {
        if (Looper.myLooper() == mHandler.getLooper()) {
            dismissDialog();
        } else {
            mHandler.post(mDismissAction);
        }
    }
 void dismissDialog() {
        ...
         sendDismissMessage();
         ...
   }
  // 使用handler调用onDismiss
 private void sendDismissMessage() {
        if (mDismissMessage != null) {
            // Obtain a new message so this dialog can be re-used
            Message.obtain(mDismissMessage).sendToTarget();
        }
    }

屏幕旋转后,looper执行 ReLaunchActivity,在ReLaunchActivity中执行
fragment的onDestroyView(),而DialogFragment 中

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

执行了 mDialog.dismiss();mDialog向looper发送message,
当ReLaunchActivity执行完之后,fragment attath到acitivity中,然后Looper执行下一个msg,就执行到
DialogFragment 的onDismiss中,而在
DialogFragment 中,调用了 dismissInternal(true);

 @Override
    public void onDismiss(DialogInterface dialog) {
        if (!mViewDestroyed) {
            // Note: we need to use allowStateLoss, because the dialog
            // dispatches this asynchronously so we can receive the call
            // after the activity is paused.  Worst case, when the user comes
            // back to the activity they see the dialog again.
            dismissInternal(true);
        }
    }

dismissInternal 又调用了remove,DialogFragment 又从activity中移除,所以,dialog不会保持弹出状态
解决办法:
重写DialogFragment 的onDismiss方法

@Override
    public void onDismiss(DialogInterface dialog) {
        LegoLog.d("dialog onDismiss");
    }

但是不建议这样做,还是不要使用 setRetainInstance(true);的方式,因为会导致内存泄漏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用dialog来实现loading框时,每次dialog弹出时手机的状态栏会变成其他颜色,这会影响用户的感官体验。为了解决这个问题,你可以使用以下方法: 1. 首先,设置透明蒙层来解决状态栏变色的问题。你可以使用以下代码: ```java Window dialogWindow = mDialog.getWindow(); dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); dialogWindow.setBackgroundDrawableResource(android.R.color.transparent); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.dimAmount = 0.0f; dialogWindow.setAttributes(lp); ``` 2. 然后,当dialog初始化时调用`dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)`方法,这样dialog弹出时,状态栏的颜色将和Activity展示的状态栏保持一致,不会随着dialog弹出和销毁而改变。 然而,这种方法会引发另一个问题,就是当设置了透明背景后,状态栏的字体也会变成白色。如果Activity标题背景是白色的话,会造成冲突。为了解决这个问题,你可以尝试以下方法: 1. 在dialog弹出之前,将状态栏字体颜色设置为黑色。你可以使用以下代码: ```java dialogWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); ``` 2. 在dialog关闭后,将状态栏字体颜色恢复为白色。你可以使用以下代码: ```java dialogWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); ``` 这样就可以解决android dialogfragment弹出时状态栏变色的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值