Предыдущий фрагмент не загружается при нажатии кнопки «Назад» с использованием BottomNavigationView

#android #bottomnavigationview

#Android #bottomnavigationview

Вопрос:

У меня есть activity_main.xml с BottomNavigationView и NavHostFragment .

Есть 2 вкладки, HomeFragment с видео и FavoritesFragment . Внутри FavoritesFragment есть список избранных видео (миниатюр), и когда я нажимаю на элемент, он загружает HomeFragment просмотр с этим конкретным видео.

внутри mobile_navigation.xml я определил HomeFragment дважды. 1 — это домашняя вкладка, а 1 — «Избранное» при нажатии на миниатюру в FavoritesFragment .

введите описание изображения здесь

Когда я нажимаю кнопку «Назад», я ожидаю вернуться в FavoriteFragment . Но приложение завершает работу.

При нажатии на миниатюру выполняется этот код:

             val action = FavoritesFragmentDirections
                .actionNavigationFavoritesToNavigationFavorite(imageUri)
            NavHostFragment.findNavController(this@FavoritesFragment)
                .navigate(action)
  

Я также пробовал это:

 protected fun showFragment(fragment: Fragment, uniqueName: String) {
    activity?.supportFragmentManager
        ?.beginTransaction()
        ?.replace(R.id.container, fragment)
        ?.addToBackStack(uniqueName)
        ?.commitAllowingStateLoss()
}
  

Но результат тот же.

С помощью этого:

 override fun onBackPressed() {
    super.onBackPressed()

    if (!navController.popBackStack()) {
        // Call finish() on your Activity
        finish()
    }
}
  

Кнопка «Назад» возвращается к HomeFragment , вместо FavoritesFragment .

 <?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/mobile_navigation"
    app:startDestination="@ id/navigation_home">

    <fragment
        android:id="@ id/navigation_home"
        android:name="eu.theappfactory.dailyrecipes.ui.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home">

        <argument
            android:name="imageuri"
            app:argType="string" />
    </fragment>

    <fragment
        android:id="@ id/navigation_favorites"
        android:name="eu.theappfactory.dailyrecipes.ui.favorites.FavoritesFragment"
        android:label="@string/title_account"
        tools:layout="@layout/fragment_favorites" >
        <action
            android:id="@ id/action_navigation_favorites_to_navigation_favorite"
            app:destination="@id/navigation_favorite" />
    </fragment>

    <fragment
        android:id="@ id/navigation_favorite"
        android:name="eu.theappfactory.dailyrecipes.ui.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home">

        <argument
            android:name="imageuri"
            app:argType="string" />
    </fragment>
</navigation>
  

Комментарии:

1. Эй, не могли бы вы также добавить код для своего навигационного графика?

2. проверьте это vinsol.com/blog/2014/10/01 /… .

3. добавлен код для графика навигации..

4. «Но приложение завершает работу». — итак, какова трассировка стека при его завершении?

5. ничего особенного. Ничего красного. Некоторые общие информационные сообщения.

Ответ №1:

Эй, я не знаю, как kotlin работает в Android, но вот как вы должны это настроить, при обратном нажатии переходит только к предыдущему действию, и если его нет, оно отключается, поскольку у вас есть 1 действие и несколько фрагментов, что вам нужно сделать, это переопределить метод onBackpress и вызвать предыдущий фрагмент, и если такового не существует, вы должны закрыть приложение, не после переопределения onBackPress вам придется выйти из приложения вручную, я собираюсь поделиться своим Java-кодом, посмотрим, сможете ли вы можете почерпнуть из него

 private void onBackAction() {
     getSupportFragmentManager().popBackStack();
}
  

Обратите внимание, что popBackStack повторно открывает фрагмент, только если он есть в стеке.

Ответ №2:

Попробуйте переопределить метод onBackPressed в активности хоста и поместите код:

 override fun onBackPressed() {
    if(!navController.popBackStack())
        finish()
}