AppBarLayout ile kaydırma görünümü örtüşme


103

Bu videodaki gibi Materyal tasarım kaydırma tekniklerinden 'İçerikle örtüşen Esnek Alan' modelini uygulamak istiyorum : Örtüşen içeriğe sahip Esnek Alan GIF

XML düzenim şu anda şöyle görünüyor:

<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>

Tasarım Kitaplığını kullanarak bunu gerçekleştirmenin kolay bir yolu var mı? Yoksa bunu yapmak için özel bir CoordinatorLayout.Behavior oluşturmam gerekiyor mu?


Karşıt olanı arıyorum, CollapsingToolbarLayout içindeki bir resim, araç çubuğundan sonra ve NestedScrollView altında başka bir renkte birkaç dps daha göstermelidir!
David

FrameLayout, RelativeLayout kullanıyordum ama her zaman parçalar actionBar ile örtüşüyordu. Çözüm, tüm parçalar için üst öğe olarak NestedScrollView kullanmaktı. Teşekkürler!
JCarlosR

Yanıtlar:


148

Aslında, kayan görünümü AppBarLayout ile kaplamak, Android Tasarım Destek Kitaplığı'nın dahil edilen bir özelliğidir : örtüşme miktarını ayarlamak app:behavior_overlapTopiçin NestedScrollView(veya ScrollingViewBehavior kullanan herhangi bir Görünüm ) özniteliği kullanabilirsiniz :

<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">

app:behavior_overlapTopYalnızca app:layout_behavior="@string/appbar_scrolling_view_behavior"özniteliği kullanan Davranış (öznitelikler genellikle geçerli olduğu için Görünüm veya Üst Görünüm Grubu değil), dolayısıyla behavior_önek olan görünümlerde çalıştığını unutmayın .

Veya setOverlayTop () aracılığıyla programlı olarak ayarlayın :

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

1
Bu neredeyse (hangi ı kurdum benim RecyclerView dışında benim için çalışıyor layout_behaviorve behavior_overlapTop) biter arkasında onun kardeş AppBarLayout. XML'deki sırayı değiştirmeyi denedim, ancak herhangi bir etkisi yok gibi görünüyor. Sorunun ne olabileceği konusunda herhangi bir fikriniz var mı?
Vicky Chijwani

1
Kaydırmayı devre dışı bıraktığımda (uygulamayı kaldırma: layout_scrollFlags öznitelikleri) - behaviour_overlapTop çalışmıyor - NestedScrollView AppBarLayout altına gidiyor. Bunu nasıl düzelteceğinizi biliyor musunuz?
Pavel Biryukov

@PavelBiryukov API <21 için ne yaptınız?
Vicky Chijwani

1
Merhaba, benim için çalışmıyor. Aldığımerror no resource identifier found for attribute behavior_overlayTop
Jack Lynx

1
@Lynx - kafa karıştırıcı bir şekilde, bu behavior_overlapTopama setOverlayTop()- örtüşme vs örtüşme. Doğru olanı kullandığınızdan emin olun!
ianhanniballake

21

Kabul edilen yanıta ek olarak, örnekte olduğu gibi başlığın üstte sabit kalmasını sağlamak için CollapsingToolbarLayout'ta setTitleEnabled (false) çağrısı yapın.

Bunun gibi:

CollapsingToolbarLayout.setTitleEnabled(false);

veya şu şekilde xml'ye ekleyerek:

app:titleEnabled="false"

Aksi takdirde başlık, elbette istediğiniz davranış bu değilse, örtüşen içeriğin arkasında kaybolabilir.


2
Genişletildiğinde başlığın örtüşmesini önlemek için CollapsingToolbarLayout'a yeterince büyük bir expandedTitleMarginBottom koyabilirsiniz.
WindRider
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.