天天看點

java.lang.illegalstateexception fragment already added dialogfragment

當我們快速點選某個按鈕彈出一個DialogFragment的時候,有時候就會出現這個異常,可以通過debug能複現這個異常

####解決方法####

if (dialogFragment == null) {//初始化DialogFragment
					dialogFragment = DialogFragment.getInstance();
				}
				if (!dialogFragment.isAdded()) {// 判斷是否已添加
					dialogFragment.show(getSupportManager(),
					DialogFragment.getClass.getName);
				}
				// 在BaseDialogFragment裡面重寫show方法,注意最後一句是重點
				public void show(FragmentManager manager) {
					String tag = getClass().getName();
					show(manager, tag);
					manager.executePendingTransactions();
				}
           

完美解決

20181107更新,上次修改之後,上線,結果還特麼報這個錯了,啪啪打臉。

網上解釋的原因是activity不在前台,然後調用onSaveInstanceState方法的時候,這個時候再調用fragment的show方法,導緻奔潰。解決方法是在show方法裡面不用commit,而使用commitAllowStateLoss代替。

如何觸發并測試這個bug呢?用Handler延遲10s顯示一個dialogFragment,然後點傳回鍵,這樣就會出現這個異常,進而确定是否真的解決了。

另外一種方案是

`override fun show(manager: FragmentManager?, tag: String?) {
	if (manager == null)
		return
    if (Integer.valueOf(android.os.Build.VERSION.SDK) > Build.VERSION_CODES.JELLY_BEAN) {
        if (manager.isDestroyed)
            return
    }
    try {
        super.show(manager, tag)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}
           

感謝

原文連結

繼續閱讀