Несмотря на наличие двух действий, опять же, я рекомендую приложения для одного действия. У меня было некоторое тестирование, чтобы отделить Activity, потому что у одного была BottomNavigation, а у другого - BottomNavigation (как ваша проблема здесь). Но я всегда застрял, чтобы перемещаться между Действиями и всегда сбрасывать backstack (насколько я тестирую это).
Другое решение было бы Nested NavigationGraph, но я избегаю некоторых вложенных, потому что я думаю, что это смешит навигацию,Так что да, я пытаюсь найти другой подход, и вот что я сейчас тестирую и использую.
Некоторое решение
Давайте создадим новый сценарий. У меня есть 3 страницы, на которых есть BottomNavigation (Панель инструментов, Поиск, Профиль). Тогда у меня есть страница, на которой нет BottomNavigation, напр. ProfileDetail, который открылся из профиля. Таким образом, в этом сценарии я создам:
- NavigationHostActivity (активность с BottomNavigation)
- DashboardFragment (фрагмент)
- SearchFragment (фрагмент)
- ProfileFragment (Fragment)
- ProfileDetailFragment (Fragment)
Я изменяю все мои макеты на Фрагменты, и когда он перемещается к любому макету, он проверяет, нужна ли им BottomNavigation. Основная концепция Show / Hide
BottomNavigation. Вот несколько примеров, которые я использую:
NavigationHostActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.bind(
this.findNavController(R.id.navigation_host_fragment),
this.binding.navigationBottomView
)
}
fun bind(navigationController: NavController, bottomNavigationView: BottomNavigationView) {
navigationController.addOnDestinationChangedListener { _, destination, _ ->
this.hideBottomNavigation(bottomNavigationView)
bottomNavigationView.menu.forEach {
if (it.itemId == destination.id) {
this.showBottomNavigation(bottomNavigationView)
}
}
}
}
fun hideBottomNavigation(bottomNavigationView: BottomNavigationView) { bottomNavigationView.visibility = View.GONE }
fun showBottomNavigation(bottomNavigationView: BottomNavigationView) { bottomNavigationView.visibility = View.VISIBLE }
Это позволит проверить, совпадает ли пункт назначения навигации с меню вашей BottomNavigation. Если это одно из меню BottomNavigation, то оно показывает BottomNavigation.
На самом деле я поставил функции bind
, show
и hide
в NavigationService, так что это примерно то, что я сделал. И это было сделано для более простого примера. Не стесняйтесь настраивать это. Я также использую привязку данных здесь FYI.
navigation_host_fragment
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation_bottom_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFF"
app:itemIconSize="22dp"
app:itemIconTint="@color/state_bottom_navigation_view"
app:itemTextColor="@color/state_bottom_navigation_view"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/menu_dashboard" />
<fragment
android:id="@+id/navigation_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/navigation_bottom_view"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/navigation_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
<data>
<variable
name="activity"
type="*.view.NavigationHostActivity" />
</data>
</layout>
menu_dashboard
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/dashboardFragment"
android:title="Dashboard"/>
<item
android:id="@+id/searchFragment"
android:title="Search" />
<item
android:id="@+id/profileFragment"
android:title="Profile" />
</menu>
И все, работаидеально для моего случая. Надеюсь, это поможет: D
С уважением,
Андреа