Visualizzazione a scorrimento sovrapposta con AppBarLayout


103

Voglio implementare il modello "Spazio flessibile con contenuto sovrapposto" dalle tecniche di scorrimento del design dei materiali , come in questo video : Spazio flessibile con GIF di contenuti sovrapposti

Il mio layout XML in questo momento è simile a:

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <android.support.design.widget.AppBarLayout
      android:layout_width="match_parent"
      android:layout_height="192dp"
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

      <android.support.v7.widget.Toolbar
          android:layout_height="?attr/actionBarSize"
          android:layout_width="match_parent"
          app:layout_collapseMode="pin"/>
    </android.support.design.widget.CollapsingToolbarLayout>
  </android.support.design.widget.AppBarLayout>

  <android.support.v4.widget.NestedScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
      <....>
    </LinearLayout>
  </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

Esiste un modo semplice per eseguire questa operazione utilizzando la Libreria del progetto? Oppure devo creare un CoordinatorLayout.Behavior personalizzato per farlo?


Sto cercando l'opposto, un'immagine all'interno di CollapsingToolbarLayout dovrebbe mostrare qualche dps in più dopo la barra degli strumenti e sotto NestedScrollView in un altro colore!
David

Stavo usando FrameLayout, RelativeLayout ma i frammenti erano sempre sovrapposti con actionBar. Usare un NestedScrollView come genitore per tutti i frammenti era la soluzione. Grazie!
JCarlosR

Risposte:


148

In effetti, la sovrapposizione della visualizzazione a scorrimento con l'AppBarLayout è una funzionalità inclusa nella libreria Android Design Support : puoi utilizzare l' app:behavior_overlapTopattributo sulla tua NestedScrollView(o qualsiasi vista utilizzando ScrollingViewBehavior ) per impostare l'importo della sovrapposizione:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    app:behavior_overlapTop="64dp">

Si noti che app:behavior_overlapTopfunziona solo su viste che hanno il app:layout_behavior="@string/appbar_scrolling_view_behavior"comportamento che utilizza l'attributo (non la vista o il gruppo di viste padre, come gli attributi di solito si applicano), da cui il behavior_prefisso.

Oppure impostalo in modo programmatico tramite setOverlayTop () :

NestedScrollView scrollView = ...
CoordinatorLayout.LayoutParams params = 
    (CoordinatorLayout.LayoutParams) scrollView.getLayoutParams();
AppBarLayout.ScrollingViewBehavior behavior =
    (AppBarLayout.ScrollingViewBehavior) params.getBehavior();
behavior.setOverlayTop(128); // Note: in pixels

1
Questo sta quasi funzionando per me, tranne il mio RecyclerView (su cui ho impostato layout_behaviore behavior_overlapTop) finisce dietro il suo fratello AppBarLayout. Ho provato a cambiare l'ordine nell'XML, ma non sembra avere alcun effetto. Qualche idea su quale potrebbe essere il problema?
Vicky Chijwani

1
Quando disabilito lo scorrimento (rimuovendo gli attributi dell'app: layout_scrollFlags) - behavior_overlapTop non funziona - NestedScrollView va sotto AppBarLayout. Sai come aggiustarlo?
Pavel Biryukov

@PavelBiryukov cosa hai fatto per API <21?
Vicky Chijwani

1
Ciao, non funziona per me. Ricevoerror no resource identifier found for attribute behavior_overlayTop
Jack Lynx

1
@Lynx - abbastanza confuso, è behavior_overlapTopma setOverlayTop()- sovrapposizione vs sovrapposizione. Assicurati di usare quello giusto!
ianhanniballake

21

Oltre alla risposta accettata , chiama setTitleEnabled (false) sul tuo CollapsingToolbarLayout per fare in modo che il titolo rimanga fisso in alto come nell'esempio.

Come questo:

CollapsingToolbarLayout.setTitleEnabled(false);

o aggiungendolo in xml in questo modo:

app:titleEnabled="false"

In caso contrario, il titolo potrebbe scomparire dietro il contenuto sovrapposto, a meno che, ovviamente, non sia questo il comportamento desiderato.


2
Puoi inserire un ExpandTitleMarginBottom sufficientemente grande in CollapsingToolbarLayout per evitare la sovrapposizione del titolo quando espanso.
WindRider
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.