androidkotlinandroid-fragmentsandroid-menuandroid-navigation

Fragment navigation and menu. How to remove latest fragment? Check description


I was incapable of finding an answer for the following context:

Let's say we have a menu and a nav graph instanced in the main activity. We have 3 fragment: Home, ItemList and Settings. We add another fragment called HourPreference. Take the next flow: I press on the bottom menu on the Settings item which takes me on the SettingsFragment. Then we press a button to take us to the HourPreferenceFragment using findNavController().navigate(SettingsFragmentDirections.actionNavigationNotificationsToNavigationHourPreference()). We are on HourPreferenceFragment. IF we press back then it takes us to SettingsFragment. But IF we press on the home item from the bottom menu, then it takes us on that Fragment and when we press on the bottom menu on the Settings item then it directions us to the HourPreferenceFragment and not the SettingsFragment. Code snippets down below. How can we get to the SettingsFragment when we go along with this flow? I appreciate any answer whether you provide me a link to another post, I was just unable to find anything after a couple hours

Briefly:

The behaviour is: Press settings icon (display SettingsFragment) -> Press hour preference (display HourPreferenceFragment)-> press home icon (display HomeFragment) -> press settings icon and it takes me to HourPreference Fragment BUT I want it to take me to the SettingsFragment!

(MainActivity.onCreate):

    val navView: BottomNavigationView = binding.navView

    navController = findNavController(R.id.nav_host_fragment_activity_main)
    val appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.navigation_home,
            R.id.navigation_items_list,
            R.id.navigation_settings
        )
    )

    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

//also

    override fun onSupportNavigateUp(): Boolean {
          return navController.navigateUp() || super.onSupportNavigateUp()
}

(activity_main.xml)

 <com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    android:background="@color/grey"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_nav_menu" />

<fragment
    android:id="@+id/nav_host_fragment_activity_main"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="64dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toTopOf="@id/nav_view"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/mobile_navigation" />

Also in the mobile_navigation.xml graph:

    <fragment
    android:id="@+id/navigation_settings"
    android:name="com.example.xpiry1.ui.settings.SettingsFragment"
    android:label="@string/title_settings"
    tools:layout="@layout/fragment_settings" >

    <action
                android:id="@+id/action_navigation_notifications_to_navigation_hour_preference"
        app:destination="@id/navigation_hour_preference"
        app:enterAnim="@anim/nav_default_enter_anim"
        app:popUpTo="@id/navigation_settings" />
    </fragment>

    <fragment
    android:id="@+id/navigation_hour_preference"
    android:name="com.example.xpiry1.ui.settings.preferences.HourPreferenceFragment"
    android:label="Hour Preferences"
    tools:layout="@layout/fragment_hour_preference">
    </fragment>

(SettingsFragment)

 binding.hourPreference.root.setOnClickListener {
            findNavController().navigate(SettingsFragmentDirections.actionNavigationNotificationsToNavigationHourPreference())

Solution

  • Found the core issue for this problem. The detailed explanation lies in this answer.

    For the moment, Is solved it by downgrading the the fragment dependency from 'androidx.navigation:navigation-fragment-ktx:2.4.1' to 'androidx.navigation:navigation-fragment-ktx:2.3.5' and now everything works fine.