22

Ho un'attività con uno CoordinatorLayout, AppBarLayout, CollapsingToolbarLayout e Toolbar. Quindi, in pratica, una vista che si interrompe quando si scorre uno RecyclerView.Mostra visualizzazione quando la barra degli strumenti viene compressa

Quello che devo fare è mostrare una vista personalizzata quando la vista del layout espanso è nascosta a causa del collasso.

Questo è mio 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> 

Alla fine, quando la barra viene espanso vista caricato con è mostrato l'elemento. Quando è collassato, non è così. Quando scompare, è necessario mostrare TextView all'interno di Toolbar. Attualmente mostra tutto il tempo.

Ho cercato negli eventi di CollapsingToolbarLayout di aggiungere un listener quando cambia dimensione così posso verificare se è più piccolo di un valore e mostrare quella vista.

Questo può essere un po 'complicato da spiegare, ma credo di essere stato chiaro. Ho cercato su google e non riesco a trovare nessuno che cerchi di fare lo stesso.

+0

Potresti semplicemente usare il contenutoScrim? – tachyonflux

+0

@karaokyo il setContentScrim e le sue varianti sono solo per drawable e colori, a meno che non manchi qualcosa. https://developer.android.com/reference/android/support/design/widget/CollapsingToolbarLayout.html –

risposta

50

Osservando la sorgente CollapsingToolbarLayout, le animazioni di bordo sono attivate tramite OnOffsetChangedListener su AppBarLayout. Quindi puoi aggiungere un altro per attivare le animazioni alfa sulla tua visualizzazione del testo:

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

Completamente funzionante! Molte grazie! Fai attenzione alla domanda: sto osservando quell'implementazione di 'CollapsibleToolbarLayout' ma come sei arrivato al valore' (2 * ViewCompat.getMinimumHeight (collapsingToolbar)) '? Grazie ancora –

+2

È lo stesso trigger che il contenuto scrim utilizza – tachyonflux

+0

Grazie per la soluzione @karaokyo Funziona come un incantesimo! Tuttavia mentre va bene per un dispositivo mobile, i casi if else non vengono attivati ​​su un tablet. Qualche idea del perché? Grazie. – Suleiman19