3

我想在一个CoordinatorLayout同时使用AppBarLayoutBottomNavigationLayout,我有隐藏BottomNavigationLayout所要求的material guideline困难。显示/隐藏BottomNavigationView与AppBarLayout

我的意思是这样的:

<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和底部导航视图。

回答

13

经过一两天的搜索,我用定制的BehaviorBottomNavigationView相连。它的主要想法是检测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, BottomNavigationView child, View directTargetChild, View target, int nestedScrollAxes) { 
     return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; 
    } 

    @Override 
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, BottomNavigationView child, View target, 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的行为是不合理的。