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的行爲是不合理的。