#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()
}