22

Ich habe eine Aktivität mit einem CoordinatorLayout, AppBarLayout, CollapsingToolbarLayout und Toolbar. Also, im Grunde eine Ansicht, die beim Scrollen eines RecyclerView kollabiert.Zeige Ansicht, wenn Symbolleiste kollabiert

Was ich tun muss, ist eine benutzerdefinierte Ansicht anzuzeigen, wenn die Ansicht des maximierten Layouts aufgrund von Kollaps ausgeblendet ist.

Das ist mein Layout:

<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="192dp" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      app:contentScrim="#2196F3" 
      app:expandedTitleMarginBottom="32dp" 
      app:expandedTitleMarginEnd="64dp" 
      app:expandedTitleMarginStart="48dp" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <include 
       android:id="@+id/header" 
       layout="@layout/header_big_first_screen" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fitsSystemWindows="true" 
       android:scaleType="centerCrop" 
       app:layout_collapseMode="parallax"/> 

      <android.support.v7.widget.CollapsingToolbarLayout 
       android:id="@+id/anim_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:layout_collapseMode="pin" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 

       <TextView 

        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:text="Hello!"/> 


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


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

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

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


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

Am Ende, wenn die Symbolleiste, um das mit dem Element geladen Ansicht erweitert wird gezeigt. Wenn es kollabiert ist, tut es das nicht. Wenn es verschwindet, sollte die TextView innerhalb Toolbar angezeigt werden. Derzeit zeigt es die ganze Zeit.

Ich habe in den Ereignissen von CollapsingToolbarLayout gesucht, um einen Listener hinzuzufügen, wenn es Größe ändert, damit ich überprüfen kann, ob das kleiner als ein Wert ist, und diese Ansicht anzeigen.

Das kann etwas schwierig zu erklären sein, aber ich glaube, ich habe mich klar gemacht. Ich habe gegoogelt und kann niemanden finden, der dasselbe versucht.

+0

Konnten Sie einfach den contentScrim benutzen? – tachyonflux

+0

@karaokyo der setContentScrim und seine Variationen sind nur für Zeichen und Farben, es sei denn, ich vermisse etwas. https://developer.android.com/reference/android/support/design/widget/CollapsingToolbarLayout.html –

Antwort

50

Bei einem Blick auf die Quelle CollapsingToolbarLayout werden die Inhalts-Scrim-Animationen über eine OnOffsetChangedListener auf der AppBarLayout ausgelöst. So können Sie eine andere hinzufügen, um Alpha-Animationen in Ihrer Textansicht auszulösen:

mListener = new AppBarLayout.OnOffsetChangedListener() { 
    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     if(collapsingToolbar.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(collapsingToolbar)) { 
      hello.animate().alpha(1).setDuration(600); 
     } else { 
      hello.animate().alpha(0).setDuration(600); 
     } 
    } 
}; 

appBar.addOnOffsetChangedListener(mListener); 
+0

Total funktioniert! Vielen Dank! Beachten Sie die Frage: Ich schaue mir die Implementierung von 'CollapsibleToolbarLayout' an, aber wie ist es zu dem Wert' (2 * ViewCompat.getMinimumHeight (collapsingToolbar)) 'gekommen? Nochmals vielen Dank –

+2

Es ist der gleiche Auslöser, dass der Inhalt Scrim verwendet – tachyonflux

+0

Danke für die Lösung @karaokyo Funktioniert wie ein Charme! Während es für ein mobiles Gerät in Ordnung ist, werden Ihre if-else-Fälle nicht auf einem Tablet ausgelöst. Irgendeine Idee warum ist das? Danke. – Suleiman19

Verwandte Themen