Saturday 3 October 2020

java.lang.IllegalStateException: Fragment already added exception for BottomSheetDialogFragment

In order to show a last state in a BottomSheetDialogFragment I try to implement as below,

*) 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?;
}

So that there is only one instance of BottomSheetDialogFragment and I need to keep a reference of many othervariables that the user has interacted with when the bottom sheet last time opened.

By doing the above steps I am able to achieve our requirement but several times it is randomly crashing and I am unable to find the root cause.

*) Exception:

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)

I know there are already many existing questions with an exact similar exception and the closest which I can think of is this.

Also, I have to use BottomSheetDialogFragment and can not use "Persistent Bottom Sheet". I seriously hope that Android should provide show and hide feature for "Modal Bottom Sheet" and not dismiss every time it closes.

*) Questions:

1) How to prevent this crash?

2) Is there a way to "hide" Modal Bottom Sheet without "dismiss"?



from java.lang.IllegalStateException: Fragment already added exception for BottomSheetDialogFragment

No comments:

Post a Comment