Скрытие панели инструментов или нижней панели навигации в компоненте навигации - PullRequest
7 голосов
/ 18 июня 2020

Я последовал руководству от android .developers и внедрил navigation component в свое приложение. Я столкнулся с проблемой, когда мне нужно, чтобы некоторые экраны были с панелью инструментов / нижней панелью навигации или без нее.

Android пример макета разработчика

  <androidx.appcompat.widget.Toolbar
        .../>

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"

        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        .../>

принудительно меня чтобы скрыть / показать панель инструментов / bottomNavBar в OnDestinationChanged обратном вызове в MainActivity:

navController.addOnDestinationChangedListener { _, destination, _ ->
                when (destination) {
                    R.id.topLevelDestination-> {
                        toolbar.visibility = View.GONE
                        bottomNav.visibility = View.VISIBLE
                    }
                    R.id.lowLevelDestination -> {
                        toolbar.visibility = View.VISIBLE
                        bottomNav.visibility = View.GONE
                    }

И, конечно, если я сделаю это так, у меня изменится размер макета до того, как я увижу новый фрагмент. Я имею в виду, что я вижу, как исчезает нижняя навигация на фрагменте A, и я вижу части фрагмента B в том месте, где была bottomNavBar, когда фрагмент A все еще находится на экране, и после этого фрагмента появляется B.

Как решить Это? Нужны ли мне вложенные навигационные графы?

Обновление

: Добавлен гиф с проблемой

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

Описание видео: это вырезанная часть моего экрана. На видео вы можете увидеть пользовательский интерфейс системы, нижнюю панель навигации и основной фрагмент с кнопкой. Когда я нажимаю кнопку, навигационный график перемещает меня к пункту назначения без нижней панели навигации. Итак, я делаю bottomNavBar.hide (), когда OnDestinationChanged. Как видите, bottomNavBar исчезает ДО того, как я нахожусь на самом деле, и вы можете видеть часть моего целевого фрагмента, видимого после того, как исчезнет bottomnavBar. Вот в чем проблема.

1 Ответ

1 голос
/ 30 июня 2020

Я застрял в этом как 2 дня, но с XML вы можете решить свою проблему

  1. Вам нужно обернуть свою панель инструментов в CoordinatorLayout
  2. Для вашей панели инструментов требуется scrollFlags: scroll и введите
  3. Вам нужно обернуть фрагмент другим слоем и поместить в layout_behavior указанное c поведение: @ string / appbar_scrolling_view_behavior
  4. В вашем BottomNavigationView поместите поведение google: com.google. android .material.behavior.HideBottomViewOnScrollBehavior

Что-то вроде этого:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    ...>

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar" />

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <fragment
            android:id="@+id/fragment_host"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/graph_main" />
    </androidx.core.widget.NestedScrollView>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:labelVisibilityMode="unlabeled"
        app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"
        app:menu="@menu/menu_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Кстати, я поместил NestedScrollView, чтобы все мои фрагменты были готовы к прокрутке и сохранил другой макет где мне это нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...