在Android中为BottomAppBar实施app:hideOnScroll

时间:2018-08-10 05:49:54

标签: android android-layout android-recyclerview android-nestedscrollview android-bottomappbar

我有一个带有一个“活动,很多片段”模型的应用程序,其中几个片段都有一个RecyclerView来显示带有内容的卡片。我还实现了Material Design 2.0中的BottomAppBar,一切正常,除非AppBar阻止了RecyclerView中的最后一个CardView。

在布局方面,我在Fragment的ConstraintLayout内有一个RecyclerView,它位于主活动的FrameLayout中。

文档显示,要在滚动we need to implement RecyclerView inside a NestedScrollView上隐藏BottomAppBar。 one question here on SO的答案也是如此,但是似乎没有实际的文档或示例来演示如何完成此操作,除了this article on Medium之外,该文档中使用NestedScrollView直接进行活动,并持有一个包含ConstraintLayout的CoordinatorLayout。

注意:我认为它也可以在魔术上起作用,因为复制片段中的布局对我的应用程序根本没有任何作用。

如何在此处使用NestedScrollView?

PS:我需要拥有TextView,因为当我没有数据要显示时,我将RecyclerView设置为VISIBILITY.GONE并将TextView设置为VISIBLE。

片段布局

<android.support.constraint.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/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="in.domain.APPNAME.Fragments.FragmentList">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerViewIncident"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingBottom="30dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <TextView
        android:id="@+id/emptyView"
        android:layout_width="wrap_content"
        android:layout_height="17dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="No Incidents to display"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.503"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

活动布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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"
    android:id="@+id/uberLayout"
    tools:context=".APPNAME">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/containerFrameLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </FrameLayout>

    </android.support.constraint.ConstraintLayout>

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <android.support.design.bottomappbar.BottomAppBar
            android:id="@+id/bottom_app_bar"
            style="@style/Widget.MaterialComponents.BottomAppBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:backgroundTint="@color/colorPrimary"
            app:fabAlignmentMode="center"
            app:navigationIcon="@drawable/baseline_menu_white_24dp"
            app:hideOnScroll="true"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        </android.support.design.bottomappbar.BottomAppBar>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/floatingActionButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:src="@drawable/baseline_add_white_24dp"
            app:backgroundTint="@color/brightred"
            app:fabSize="normal"
            app:layout_anchor="@+id/bottom_app_bar"
            tools:layout_editor_absoluteX="160dp"
            tools:layout_editor_absoluteY="465dp" />


    </android.support.design.widget.CoordinatorLayout>

</android.support.design.widget.CoordinatorLayout>

1 个答案:

答案 0 :(得分:1)

您不应将Private Sub RemoveMergeSheet() On Error Resume Next ActiveWorkbook.Worksheets("RDBMergeSheet").Delete End Sub BottomAppBar放在单独的FloatingActionButton中。将CoordinatorLayout插入其中,CoordinatorLayout放在您的ConstraintLayout周围,这可能已经解决了问题。

FrameLayout

我使用的布局相似,唯一的区别是<?xml version="1.0" encoding="utf-8"?> <android.support.design.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" android:id="@+id/uberLayout" tools:context=".APPNAME"> <FrameLayout android:id="@+id/containerFrameLayout" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> <android.support.design.bottomappbar.BottomAppBar android:id="@+id/bottom_app_bar" style="@style/Widget.MaterialComponents.BottomAppBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" app:backgroundTint="@color/colorPrimary" app:fabAlignmentMode="center" app:navigationIcon="@drawable/baseline_menu_white_24dp" app:hideOnScroll="true" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> <android.support.design.widget.FloatingActionButton android:id="@+id/floatingActionButton" android:layout_width="100dp" android:layout_height="wrap_content" android:src="@drawable/baseline_add_white_24dp" app:backgroundTint="@color/brightred" app:fabSize="normal" app:layout_anchor="@+id/bottom_app_bar" /> </android.support.design.widget.CoordinatorLayout> 而不是<fragment>,并且BottomAppBar在滚动时很好地隐藏了。如果我们的滚动内容仍然是<FrameLayout>,则无需使用NestedScrollView,因为RecyclerView实现了NestedScrollingChild

  

此接口应由希望支持将嵌套滚动操作分派给协作的父级ViewGroup的View子类实现。