通过滚动隐藏后以编程方式显示工具栏(Android设计库)

时间:2015-06-21 21:32:51

标签: android android-design-library

我有以下布局:抽屉,主内容视图有AppBarLayout,RecyclerView和TextView。当我滚动回收器时,工具栏被正确隐藏。

但是,我有一个用例:当回收器中的所有物品都被移除时,我将其可见性设置为“消失了”。以及显示相应消息的TextView。如果在隐藏工具栏时完成此操作,则用户无法再次看到工具栏。

是否可以以编程方式使工具栏完全显示?每当显示TextView而不是RecyclerView时,我都会这样做。

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    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:animateLayoutChanges="true">

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

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

            <Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/actionBarSize"
                app:layout_scrollFlags="scroll|enterAlways"/>

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

        <android.support.v7.widget.RecyclerView
            android:id="@+id/test_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

        <TextView
            android:id="@+id/empty_test_list_info_label"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:padding="@dimen/spacing_big"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:visibility="gone"/>

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

    <RelativeLayout
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="?android:attr/windowBackground"
        android:elevation="10dp"/>

</android.support.v4.widget.DrawerLayout>
顺便说一句,出于某种原因,如果我把AppBarLayour放在RecyclerView之后,就像所有教程似乎都显示它一样,它会隐藏列表中最顶层的项目。只有当它高于它时它才能正常工作。

3 个答案:

答案 0 :(得分:9)

您可以访问包含工具栏的AppBarLayout

来执行此操作

以下是一个例子:

if (mToolbar.getParent() instanceof AppBarLayout){
  ((AppBarLayout)mToolbar.getParent()).setExpanded(true,true);
}

setExpanded(expand,animation)将完成这项工作。 您也可以使用AppBarLayout的引用,而不是从工具栏中调用getParent。

答案 1 :(得分:0)

你可以做toolbar.transitionY(int y);在on滚动方法或使用可见性消失,你必须在列表视图或回收器视图中添加一个标题与工具栏的大小。所以整个列表仍然显示

答案 2 :(得分:0)

您需要将标题添加到RecyclerViewAppBarLayout的高度。即在RecyclerView的第0位,您需要添加标题,然后添加其余元素。

如果您想强制显示Toolbar,实际上AppBarLayout会偏移AppBarLayout相关视图的顶部和底部(称为Behavoir)。您需要保持AppBarLayout的高度参考,因为我们知道高度是视图Rect top and bottom之间的距离。

假设您的AppBarLayout仅持有Toolbar

int mAppBarLayoutHeight = mAppBarLayout.getBottom() - mAppBarLayout.getTop(); //initial, normal height

 private void showToolbar(){
        if(this.mAnimator == null) {
            this.mAnimator = new ValueAnimator();
            this.mAnimator.setInterpolator(new DecelerateInterpolator());
            this.mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                 int animatedOffset = (int) animation.getAnimatedValue();
                 mToolbar.offsetTopBottom(animatedOffset/2);
                }
            });
        } else {
            this.mAnimator.cancel();
        }

        this.mAnimator.setIntValues(0, mAppBarLayoutHeight);
        this.mAnimator.start();
    }