gpt4 book ai didi

android - java.lang.IllegalStateException : Fragment already added exception for BottomSheetDialogFragment 错误

转载 作者:行者123 更新时间:2023-12-05 00:04:18 25 4
gpt4 key购买 nike

为了在 BottomSheetDialogFragment 中显示最后一个状态,我尝试如下实现,

*) Activity :

    private var languageSelectorBsFragment: LanguageSelectorBsFragment? = null


@OnClick(R.id.txt_imc_clip_language)
fun onClickClipLanguage() {
initLanguageBottomSheet()
languageSelectorBsFragment?.show(supportFragmentManager, languageSelectorBsFragment!!.tag)
}

private fun initLanguageBottomSheet() {
if (languageSelectorBsFragment == null) {
languageSelectorBsFragment = LanguageSelectorBsFragment.newInstance(LanguageSelectorBsFragment.TYPE_USER)
}
}

*) BottomSheetDialogFragment

class LanguageSelectorBsFragment : BottomSheetDialogFragment() {
var lastSelectedLanguageId: String?;
var userInputInEditText: String?;
}

因此只有一个 BottomSheetDialogFragment 实例,我需要保留对上次打开底部工作表时用户与之交互的许多其他变量的引用。

通过执行上述步骤,我能够实现我们的要求,但有几次随机崩溃,我无法找到根本原因。

*) 异常:

Fatal Exception: java.lang.IllegalStateException: Fragment already added: LanguageSelectorBsFragment{2b446ae} (8fe75d96-932d-47eb-97af-128319431a55)}
at androidx.fragment.app.FragmentStore.addFragment(FragmentStore.java:67)
at androidx.fragment.app.FragmentManager.addFragment(FragmentManager.java:1563)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:405)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6351)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)

我知道已经有很多存在完全相似异常的问题,我能想到的最接近的是 this .

此外,我必须使用 BottomSheetDialogFragment 而不能使用“持久性底部工作表”。我真心希望 Android 应该为“Modal Bottom Sheet”提供显示和隐藏功能,而不是在每次关闭时都关闭。

*) 问题:

1)如何防止这种崩溃?

2) 有没有办法在不“关闭”的情况下“隐藏”模态底部工作表?

最佳答案

我自己也遇到过这个问题,这是我处理它的方法,也许它会对你有所帮助。
我必须在该对话框显示在其上的 Fragment 的整个生命周期中保持 BottomSheetDialogFragment 的状态。

基本上,我创建了一个共享的 ViewModel, fragment 有一个实例,显示的每个对话框都有一个实例。
这样,您每次显示对话框时都可以获得相同的数据。
显示了简单的实现 here .

这样一来,您就不需要在 Activity 中保存对话框的实例,而只需通过 ViewModel 访问对话框中的数据。它非常干净且易于维护。

关于android - java.lang.IllegalStateException : Fragment already added exception for BottomSheetDialogFragment 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64129684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com