14

Ich habe MapFragment mit Parallaxe-Effekt innerhalb AppBarLayout:Wie kann das Scrollen von AppBarLayout in CoordinatorLayout deaktiviert werden?

enter image description here

ich auf AppBarLayout deaktivieren möge Scrollen, weil es nicht möglich ist, über die Karte zu bewegen, da auf der Karte berühren evenys immer als Scroll-Ereignisse behandelt werden . Ich würde gerne kollabieren von AppBarLayout durch Scrollen nur RecyclerView, die auf der Unterseite des Bildschirms ist.

Das ist mein xml:

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

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

Sie für die Antwort danken.

+0

Wo zu deaktivieren, ist Ihr 'CoordinatorLayout'? –

Antwort

35

Ich bin nicht sicher, ob ich es bekommen hätte, aber ich denke, sie ein DragCallback suchen.

Die Schnittstelle DragCallback ermöglicht es zu wählen, ob die Geschwister Scroll-Ansicht durch Scrollen auf die AppBarLayout gesteuert werden soll.

Sie einen durch den Aufruf definieren:

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; 
    } 
}); 

Durch immer false Rückkehr, wird Ihre Rolle im Blick nicht von der ABL nicht mehr kontrolliert werden.

Hinweis:, bevor Sie dies aufrufen, sollten Sie überprüfen, dass ViewCompat.isLaidOut(appBarLayout), sonst params.getBehavior() Null zurückgibt.

+0

Eigentlich die Lösung, die ich oben hinzugefügt hat, hat den Trick, aber danke für die Hilfe trotzdem. Ich bin neugierig, also werde ich es versuchen :) – janox1x2x3

+1

Das Setzen von onInterceptTouchEvent auf den Koordinator könnte Ihnen in Zukunft ein Problem bereiten. Dies ist die "offizielle" Lösung (wenn ich deine Frage habe). – natario

+1

Kann nicht mit dieser Lösung arbeiten. Kannst du bitte ein bisschen mehr erklären? Danke –

3

Also nach zwei Stunden des Versuchs habe ich eine Lösung gefunden, die ziemlich einfach ist. Ich brauche nur CoordinatorLayout zu erweitern und OnInterceptTouchEvent Methode überschreiben, so dass die Klasse wie folgt aussieht:

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

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

}

+1

es deaktivieren, aber nicht deaktivieren einklappen .. –

17

Problem

  1. AppBarLayout scrollt, auch wenn der Scroll-Inhalt auf den Bildschirm passt.
  2. Dies liegt daran, dass wir standardmäßig AppBarLayout durch Berühren von & ziehen AppBarLayout ziehen können.

Lösung

  1. Wir deaktivieren "Ziehen" Verhalten für AppBarLayout.

    // 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); 
    } 
    

Referenz

  1. Dies ist nur Erweiterung von oben akzeptierte Antwort "des Natario". durch Definieren eines benutzerdefinierten app:layout_behavior in xml

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

+0

Perfekter Mann! Vielen Dank! – anthony

+0

Hallo Vasanth! Ich möchte den Benutzer scroll (von CoordinatorLayout) deaktivieren, wenn er in die Recycleransicht scrollt. Wie kann ich das bitte tun? – anthony

3

Sie können dies erreichen. Mit diesem Ansatz müssen Sie sich keine Gedanken darüber machen, einen Verweis auf LayoutParams zu erhalten und Null-Prüfungen durchzuführen.

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

Dann eine benutzerdefinierte Klasse erstellen, die von AppBarLayout.Behavior erstreckt.

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

Dies ist die richtige Lösung –

0

können Sie die NestedScrollView.setNestedScrollingEnabled(false) verwenden, um die AppBarLayout nestScroll Envent

Verwandte Themen