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
. Он действительно чистый и простой в обслуживании.