2015-12-07 60 views
2

我有一個工具欄與一個TabLayout和一個圖像包裝在一個CollapsingToolbarLayout內。這GIF幾乎總結起來:禁用擴展的AppBarLayout

https://raw.githubusercontent.com/vitovalov/TabbedCoordinatorLayout/master/art/demo.gif

這是XML:

<?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" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapse_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="250dp" 
      android:fitsSystemWindows="true" 
      app:contentScrim="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <ImageView 
       android:id="@+id/header" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="@drawable/photo" 
       android:fitsSystemWindows="true" 
       android:scaleType="centerCrop" 
       app:layout_collapseMode="parallax"/> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="100dp" 
       android:gravity="top" 
       android:minHeight="?attr/actionBarSize" 
       app:layout_collapseMode="pin" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:titleMarginTop="15dp"/> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tabs" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:layout_gravity="bottom" 
       app:tabIndicatorColor="@color/colorAccent"/> 

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

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

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

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

我想實現的是,例如在標籤2我不想讓用戶能夠看到圖像。所以即使他試圖拉AppBarLayout,他也不應該在任何情況下看到圖像。

在顯示標籤2時調用appBarLayout.setExpanded(false);會隱藏圖像並將所有內容都折回。儘管在按下AppBarLayout並向下滑動的時候,您仍然可以恢復圖像。這不應該是這樣。

如何防止此行爲?

我正在使用v23.1.1的支持庫。對於版本22的圖書館已經有this question。然而,解決方法不再適用於版本23.

+0

您是否已經牛逼通過將可見性切換到圖像上的GONE/VISIBLE? – GPack

+0

是的,我也試過 – Niklas

回答

9

我發現了一個技巧!

  • 當我想要我的appbar保持崩潰:

    public void lockAppBarClosed() { 
        mAppBarLayout.setExpanded(false, false); 
        mAppBarLayout.setActivated(false); 
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams(); 
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_height); 
    } 
    
  • 當我想要我的appbar擴大和再次滾動

    public void unlockAppBarOpen() { 
        mAppBarLayout.setExpanded(true, false); 
        mAppBarLayout.setActivated(true); 
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams(); 
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_expand_height); 
    } 
    

希望它會幫助你!

+0

這是相當不錯的 - 但我需要兩件額外的東西 - 我需要這個縮小的條顯示縮小的文本,它應該仍然能夠對水龍頭做出反應... – Kibi

+0

注意,如果你有一個透明的狀態欄,這將在它下面。您還需要將其添加到您的偏移量中。 –

1

安妮克萊爾提供的竅門工作,但你最終失去動畫。我所做的是創建一個自定義行爲,擴展了AppBarLayout.Behavior類,使我可以在每次選擇時啓用/禁用滾動。

public class CustomAppBarLayoutBehavior extends AppBarLayout.Behavior { 

    private boolean shouldScroll = false; 

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

    @Override 
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) { 
     return shouldScroll; 
    } 

    @Override 
    public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) { 
     if(shouldScroll){ 
      return super.onTouchEvent(parent, child, ev); 
     }else{ 
      return false; 
     } 
    } 

    public void setScrollBehavior(boolean shouldScroll){ 
     this.shouldScroll = shouldScroll; 
    } 

    public boolean isShouldScroll(){ 
     return shouldScroll; 
    } 
} 

你應該再將此行爲您AppBarLayout在XML佈局

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar_layout" 
    android:layout_width="wrap_content" 
    android:layout_height="@dimen/activity_main_toolbar_height_extended" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark" 
    android:fitsSystemWindows="true" 
    android:elevation="4dp" 
    app:layout_behavior="io.eighttails.mvp.widgets.CustomAppBarLayoutBehavior"> 

然後你就可以請做開啓和關閉它,你:

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); 
((CustomAppBarLayoutBehavior)layoutParams.getBehavior()).setScrollBehavior(true); 

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); 
((CustomAppBarLayoutBehavior)layoutParams.getBehavior()).setScrollBehavior(false);