android – 使用AppBarLayout在CoordinatorLayout中滚动显示/隐藏BottomNavigationView

我试图在一个CoordinatorLayout中同时使用AppBarLayout和BottomNavigationLayout,并且我很难按照 material guideline的要求隐藏BottomNavigationLayout.

我的意思是这样的:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="false">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_insetEdge="top"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:layout_scrollFlags="scroll|enteralways"/>
    </android.support.design.widget.AppBarLayout>


    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_nav"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_gravity="bottom"
        app:menu="@menu/menu_bottom_navigation"/>

    <FrameLayout
        android:id="@+id/content_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

如您所见,我还有一个FrameLayout,用于包含具有实际内容的片段.目前,BottomNavigationView没有认/内置行为 – 既不是视图本身,也不是它的兄弟.现有的appbar_scrolling_view_behavior与appbar协调处理内容视图,但忽略其他兄弟.

我正在寻找一种隐藏的方法,并在滚动时显示appbar和底部导航视图.

解决方法

经过一两天的搜索后,我决定使用附加到BottomNavigationView的自定义 Behavior.它的主要思想是检测何时滚动BottomNavigationView的兄弟,以便它可以隐藏BottomNavigationView.像这样的东西:
public class BottomNavigationBehavior extends CoordinatorLayout.Behavior<BottomNavigationView> {

    public BottomNavigationBehavior() {
        super();
    }

    public BottomNavigationBehavior(Context context,AttributeSet attrs) {
        super(context,attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent,BottomNavigationView child,View dependency) {
        boolean dependsOn = dependency instanceof FrameLayout;
        return dependsOn;
    }

    @Override
    public boolean onStartnestedScroll(CoordinatorLayout coordinatorLayout,View directTargetChild,View target,int nestedScrollAxes) {
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
    }

    @Override
    public void onnestedPreScroll(CoordinatorLayout coordinatorLayout,int dx,int dy,int[] consumed) {
        if(dy < 0) {
            showBottomNavigationView(child);
        }
        else if(dy > 0) {
            hideBottomNavigationView(child);
        }
    }

    private void hideBottomNavigationView(BottomNavigationView view) {
        view.animate().translationY(view.getHeight());
    }

    private void showBottomNavigationView(BottomNavigationView view) {
        view.animate().translationY(0);
    }
}

如您所见,我使用简单的ViewPropertyAnimator,使用子视图的animate方法获得.这导致了一个简单的动画,它与AppBarLayout的行为并不完全匹配,但它足够好看,同时它很容易实现.

我希望在某些时候Android团队会在支持库中为BottomNavigationView添加一个认行为,所以我认为花更多的时间来完全复制AppBarLayout的行为是不合理的.

编辑(2018年4月):有关onStartnestedScroll和onnestedPreScroll及其新版本的详细说明,请参阅注释部分.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...