0

Eines meiner Projekte verwendet eine gemeinsame Verhaltensklasse zu verbergen/zeigen die Fab-Schaltfläche, die perfekt funktioniert. Nun, um einige Layout-Anforderungen zu ändern, funktioniert die Show Fab auf Scroll-up nicht.FloatingActionButton scroll bewusst Probleme mit RecyclerView in FrameLayout

Das CoordinatorLayout-Setup ist Standard und enthält einen ViewPager, der Fragmente darin lädt. Die Änderungen am Fragment-Layout haben dazu geführt, dass das Fab-Show-Verhalten nicht mehr korrekt funktioniert.


Hier ist das ursprüngliche Arbeits Fragment Layout:

<SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RecyclerView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/filterMenu" 
     android:clipToPadding="false" /> 
</SwipeRefreshLayout> 

Hier ist das neue Fragment-Layout, das nicht funktioniert:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout 
     android:id="@+id/emptyStateView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:translationY="@dimen/home_empty_state_y_offset"> 

     <ImageView 
      android:id="@+id/emptyStateImage" 
      android:layout_width="wrap_content" 
      android:layout_height="160dp" 
      android:layout_centerInParent="true" 
      android:src="@drawable/home_empty_state_animation" /> 

    </RelativeLayout> 

    <SwipeRefreshLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <RecyclerView 
      android:id="@+id/list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@+id/filterMenu" 
      android:clipToPadding="false" /> 
    </SwipeRefreshLayout> 
</FrameLayout> 
wie

Es scheint, Das hinzugefügte FrameLayout verursacht diese Probleme, aber ich bin nicht t sicher warum. Ist das ein Designproblem? oder verpasse ich etwas?

Antwort

2

Gut gelöst das Problem. Es gibt eine Art von Fehler oder etwas Seltsames mit den FloatingActionButton und CoordinatorLayout.

FloatingActionButton.hide() macht die Schaltfläche Sichtbarkeit GONE. Dies scheint die CoordinatorLayout zu veranlassen, weitere Ereignisse für FloatingActionButton zu ignorieren. Aus diesem Grund wurde beim Herunterscrollen der Knopf nicht erneut angezeigt.

Die Lösung war sicherzustellen, dass die Sichtbarkeit der FloatingActionButton auf INVISIBLE nach dem Aufruf FloatingActionButton.hide() festgelegt wurde.

@Override 
public void onNestedScroll(CoordinatorLayout coordinatorLayout, final FloatingActionButton child, 
          View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, 
      dyUnconsumed); 

    if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) 
    { 
     // This fixes odd issue where fab doesn't show when scrolling down. Seems like the fab 
     // is being set as GONE when hidden. This causes the events on this view to be ignored 
     // by the CoordinatorLayout. 
     child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
      @Override 
      public void onShown(FloatingActionButton fab) { 
       super.onShown(fab); 
      } 

      @Override 
      public void onHidden(FloatingActionButton fab) { 
       super.onHidden(fab); 


       child.setVisibility(View.INVISIBLE); 
      } 
     }); 
    } 
    else if (dyConsumed <= 0 && child.getVisibility() != View.VISIBLE) 
    { 
     child.show(); 
    } 
} 
+0

verrücktes Problem ... Danke für das Teilen! –

0

Ich hatte das gleiche Problem nach Update-Support-Bibliothek auf Version 25.1.0. Wenn Sie in Ihrer Verhaltensklasse die Sichtbarkeit von Ansichten auf GONE festlegen, werden diese Ansichten jetzt ignoriert. Mögliche Lösungen sind das Downgrade der Support-Bibliothek oder das Aktualisieren der Verhaltensklasse. Erstellen Sie Ansichten INVISIBLE anstelle von GONE.

+0

Ich bin mir nicht sicher, dass Sie die Frage verstanden haben? Das Problem ist, dass das hinzugefügte FrameLayout keine Scrolling-Änderungen meldet, so dass die Behaviour-Klasse den Fab-Button korrekt verstecken/anzeigen kann. – Jona

Verwandte Themen