14

Ben AppBarLayout içindeki paralaks etkisi ile MapFragment var:CoordinatorLayout'ta AppBarLayout öğesinin kaydırılması nasıl devre dışı bırakılır?

enter image description here

Ben harita üzerinde hareket etmek mümkün olmadığından harita üzerinde dokunmatik evenys hep kaydırma olaylar olarak ele alınır çünkü, AppBarLayout kaydırma devre dışı bırakmak istiyor . AppBarLayout çökmesini sadece ekranın alt kısmında bulunan RecyclerView kaydırarak işlemek istiyorum.

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    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="wrap_content" 
     android:fitsSystemWindows="true" 
     app:contentScrim="@color/white" 
     app:expandedTitleMarginEnd="64dp" 
     app:expandedTitleMarginStart="48dp" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" 
     app:titleEnabled="false"> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:layout_collapseMode="parallax" 
      android:fitsSystemWindows="true"> 

      <fragment 
       android:id="@+id/map" 
       android:name="com.androidmapsextensions.SupportMapFragment" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
     </FrameLayout> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="73dp" 
      app:contentInsetLeft="0dp" 
      app:contentInsetStart="0dp" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 

      <include 
       android:id="@+id/search_bar" 
       layout="@layout/layout_searchbar" /> 
     </android.support.v7.widget.Toolbar> 

     <View 
      android:id="@+id/toolbar_shadow" 
      android:layout_width="match_parent" 
      android:layout_height="3dp" 
      android:layout_below="@id/search_bar" 
      android:layout_gravity="bottom" 
      android:background="@drawable/toolbar_dropshadow" 
      android:visibility="gone" /> 
    </android.support.design.widget.CollapsingToolbarLayout> 
</android.support.design.widget.AppBarLayout> 


<RecyclerView 
    android:id="@+id/farm_list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/transparent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

<?xml version="1.0" encoding="utf-8"?> 

yanıt için teşekkür ederiz:

Bu

benim xml olduğunu.

+0

devre dışı bırakmak için NestedScrollView.setNestedScrollingEnabled(false) kullanabilir? –

cevap

35

Anladım emin değilim, ama bir DragCallback aradığınız düşünüyorum.

DragCallback arabirimi, karde kaydırma görünümünün AppBarLayout üzerine kaydırılarak kontrol edilip edilmeyeceğini seçmeye yarar.

Sen arayarak birini tanımlayabilirsiniz:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); 
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); 
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() { 
    @Override 
    public boolean canDrag(@NonNull AppBarLayout appBarLayout) { 
     return false; 
    } 
}); 

hep false dönen olarak, kaydırma görünümü artık ABL tarafından kontrol edilmez.

Not: bunu çağırmadan önce ViewCompat.isLaidOut(appBarLayout) numaralı telefonu kontrol etmelisiniz, aksi halde params.getBehavior() null değerini döndürecektir. Kaydırma içeriği ekrana sığar bile

+0

Aslında yukarıda eklediğim çözüm hile yaptı, ama yine de yardım için teşekkürler. Merak ediyorum, bu yüzden bir deneyin vereceğim :) – janox1x2x3

+1

Koordinatörü açmak içinInterceptTouchEvent size gelecekte bir sorun verebilir. Bu "resmi" bir çözümdür (eğer sorunuz varsa). – natario

+1

Bu çözüm ile çalışamaz. Biraz daha açıklayabilir misiniz lütfen? Teşekkürler –

3

İki saatlik bir denemeden sonra oldukça basit bir çözüm buldum. Sadece CoordinatorLayout genişletmek ve sınıf şuna benzer şekilde OnInterceptTouchEvent yöntemini geçersiz kılmak için gerekli:

public class NonTouchableCoordinatorLayout extends CoordinatorLayout { 
public NonTouchableCoordinatorLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return false; 
} 

}

+1

genişlemeyi devre dışı bırak ama çökmeyi devre dışı bırakma .. –

17

Sorun

  1. AppBarLayout kaydırır.
  2. Varsayılan olarak, AppBarLayout'ı sürükleyerek AppBarLayout'ı sürükleyerek &'a dokunarak AppBarLayout'u sürükleyebiliriz.

Çözüm

  1. Biz AppBarLayout için davranışını "sürükleme" devre dışı bırakacaktır.

    // Disable "Drag" for AppBarLayout (i.e. User can't scroll appBarLayout by directly touching appBarLayout - User can only scroll appBarLayout by only using scrollContent) 
    if (appBarLayout.getLayoutParams() != null) { 
        CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); 
        AppBarLayout.Behavior appBarLayoutBehaviour = new AppBarLayout.Behavior(); 
        appBarLayoutBehaviour.setDragCallback(new AppBarLayout.Behavior.DragCallback() { 
         @Override 
         public boolean canDrag(@NonNull AppBarLayout appBarLayout) { 
          return false; 
         } 
        }); 
        layoutParams.setBehavior(appBarLayoutBehaviour); 
    } 
    

Referans

  1. Bu yukarıdaki "natario yönettiği" kabul cevabın sadece uzantısıdır.

  2. https://developer.android.com/reference/android/support/design/widget/AppBarLayout.Behavior.DragCallback.html

+0

Mükemmel adam! Teşekkür ederim! – anthony

+0

Merhaba Vasanth! Geridönüşüm menüsüne girdiğinde kullanıcı kaydını (CoordinatorLayout) devre dışı bırakmak istiyorum. Bunu nasıl yapabilirim lütfen? – anthony

3

Sen xml özel bir app:layout_behavior tanımlayarak gerçekleştirebilirsiniz. Bu yaklaşımla, LayoutParams referansı almak ve boş çekler yapmak konusunda endişelenmenize gerek yoktur.

<android.support.design.widget.AppBarLayout 
     android:id="@+id/app_bar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="com.yourcompany.FixedAppBarLayoutBehavior" 
     > 

Sonra AppBarLayout.Behavior uzanan özel bir sınıf oluşturmak.

public class FixedAppBarLayoutBehavior extends AppBarLayout.Behavior { 

    public FixedAppBarLayoutBehavior(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setDragCallback(new DragCallback() { 
     @Override public boolean canDrag(@NonNull AppBarLayout appBarLayout) { 
     return false; 
     } 
    }); 
    } 
} 
+0

Bu doğru çözümdür –

0

Eğer `CoordinatorLayout` olan AppBarLayout nestScroll envent