alashow
alashow

Reputation: 2825

Navigation causes crash after opening killed activity

My app crashes after restarting killed activity that uses multiple back stack as shown in samples for bottom navigation tabs. It only crashes when using multistack.

Stacktrace:

 Caused by: java.lang.IllegalArgumentException
    at androidx.lifecycle.LifecycleRegistry.downEvent(LifecycleRegistry.java:263)
    at androidx.lifecycle.LifecycleRegistry.backwardPass(LifecycleRegistry.java:314)
    at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:334)
    at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
    at androidx.lifecycle.LifecycleRegistry.setCurrentState(LifecycleRegistry.java:118)
    at androidx.navigation.NavBackStackEntry.updateState(NavBackStackEntry.java:150)
    at androidx.navigation.NavBackStackEntry.setMaxLifecycle(NavBackStackEntry.java:130)
    at androidx.navigation.NavController.popBackStackInternal(NavController.java:325)
    at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:426)
    at androidx.navigation.NavController.onGraphCreated(NavController.java:636)
    at androidx.navigation.NavController.setGraph(NavController.java:586)
    at androidx.navigation.NavController.setGraph(NavController.java:551)
    at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:247)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2867)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:444)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1287)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1444)
    at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1522)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1575)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3001)
    at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2938)
    at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:240)
    at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:243)
    at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:118)
    at my.base.ui.base.DaggerActivity.onCreate(DaggerActivity.kt:26)
    at my.base.ui.base.delegate.LocalizationActivity.onCreate(LocalizationActivity.kt:29)
    at my.base.ui.base.BaseActivity.onCreate(BaseActivity.kt:34)
    at my.base.ui.base.BaseFragNavActivity.onCreate(BaseFragNavActivity.kt:37)
    at my.app.ui.MainActivity.onCreate(MainActivity.kt:40)
    at android.app.Activity.performCreate(Activity.java:5937)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
    ... 10 more

Line where it throws the exception:

private static Event downEvent(State state) {
        switch (state) {
            case INITIALIZED:
                throw new IllegalArgumentException();

Dependencies:

const val navigationFragment = "androidx.navigation:navigation-fragment-ktx:2.3.0"
const val navigationUi = "androidx.navigation:navigation-ui-ktx:2.3.0"

Setup code:

binding.bottomNavigation.setupWithNavController(
            listOf(
                R.navigation.nav1,
                R.navigation.nav2,
                R.navigation.nav3
            ),
            supportFragmentManager,
            R.id.container,
            intent
        ).observe(this) { controller ->
            navController = controller
            controller.addOnDestinationChangedListener(this)
        }

Xml (tried with <fragment/> too):

<androidx.fragment.app.FragmentContainerView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:name="androidx.navigation.fragment.NavHostFragment"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

Google issue tracker (has a reproducible sample)

Upvotes: 1

Views: 2666

Answers (1)

alashow
alashow

Reputation: 2825

Apparently the problem was having the same id for navigation graphs and destinations. https://issuetracker.google.com/issues/161825212

Upvotes: 3

Related Questions