java.lang.IllegalStateException: фрагмент уже добавил исключение для BottomSheetDialogFragment

Чтобы показать последнее состояние в BottomSheetDialogFragment, я пытаюсь реализовать, как показано ниже,

*) Активность:

    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)

Я знаю, что уже есть много существующих вопросов с точно таким же исключением, и самое близкое, что я могу придумать, - это.

Кроме того, я должен использовать BottomSheetDialogFragment и не могу использовать "Постоянный нижний лист". Я серьезно надеюсь, что Android должен предоставлять функцию отображения и скрытия для "Модального нижнего листа", а не отключать его каждый раз, когда он закрывается.

*) Вопросы:

1) Как предотвратить этот сбой?

2) Есть ли способ "скрыть" нижний лист модального окна без "отклонения"?

1 ответ

У меня сама была эта проблема, и я решил ее таким образом, возможно, это поможет вам.
Я должен был сохранить состояние BottomSheetDialogFragment на протяжении всего жизненного цикла Fragment что этот диалог показывался поверх.

Итак, я создал общий ViewModelчто существует один его экземпляр для фрагмента и один и тот же экземпляр для каждого показанного диалога.
Таким образом, вы можете получать одни и те же данные каждый раз, когда открываете диалог. Здесь
показана простая реализация.

Таким образом, вам не нужно удерживать экземпляр диалогового окна в своей деятельности, а просто получать доступ к данным в диалоговом окне через ViewModel. Он действительно чистый и простой в обслуживании.