CoordinatorLayout 内的静态 BottomNavigation 但不是直接子级

Static BottomNavigation inside CoordinatorLayout but not as direct child

我有顶层容器 CoordinatorLayoutToolbar 在滚动时隐藏,这个容器包含碎片。

    <androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.screens.main.MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">

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

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

    <include layout="@layout/content_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

我的一个片段包含 RecycleViewBottomNavigation

 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:pp="http://schemas.android.com/tools"
    android:id="@+id/cl_content"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.core.widget.NestedScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <androidx.recyclerview.widget.RecyclerView/>

    </androidx.core.widget.NestedScrollView>

    <BottomNavigation />

</androidx.constraintlayout.widget.ConstraintLayout>

BottomNavigation 随内容滚动的问题,当应用程序启动时 BottomNavigation 几乎看不见,当我向下滚动时 BottomNavigation 变得可见,反之亦然,我需要它是静态的,没有滚动行为,有什么配置吗?

我猜是因为 BottomNavigation 不是 CoordinatorLayout 的直接子代,但有解决方法吗?

演示项目(忽略幻灯片和图库):

https://github.com/pavelpoley/CoordinatorLayoutQuestion

您可以进行一些更改

  • exitUntilCollapsed 标记添加到 Toolbar

    app:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"

  • NestedScrollView中删除app:layout_behavior,并将其添加到根ConstraintLayout

通过应用这些,布局将是:

<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.screens.main.MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

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

    <include layout="@layout/content_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

和片段:

 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:pp="http://schemas.android.com/tools"
    android:id="@+id/cl_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.core.widget.NestedScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <androidx.recyclerview.widget.RecyclerView/>

    </androidx.core.widget.NestedScrollView>

    <BottomNavigation />

</androidx.constraintlayout.widget.ConstraintLayout>

从您的 content_main.xml

中删除 app:layout_behavior="@string/appbar_scrolling_view_behavior"
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/app_bar_main">

</androidx.constraintlayout.widget.ConstraintLayout>

更新:在使用更复杂的层次结构更新演示项目后,提供的解决方案没有按预期工作。

我做了很多研究,但找不到任何干净的解决方案来在 CoordinatorLayout 中包含 BottomNavigationView,但不是直接的 child。

唯一的解决方案是将 BottomNavigationView 作为 CoordinatorLayout 移动到 child,然后根据 androidx.navigation.NavController 目的地更改其可见性。

源代码: https://github.com/dautovicharis/CoordinatorLayoutQuestion/commits/master