0

Un de mes projets utilise une classe de comportement commune pour masquer/montrer le bouton Fab qui fonctionne parfaitement. Maintenant, faites quelques changements d'exigences de mise en page, le show fab sur scroll up ne fonctionne pas.FloatingActionButton problèmes de défilement avec RecyclerView à l'intérieur de FrameLayout

La configuration de CoordinatorLayout est standard et contient un ViewPager qui charge les fragments. Les modifications apportées à la disposition Fragment ont provoqué le dysfonctionnement du comportement du show fab.


Voici la mise en page de Fragment de travail d'origine:

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

Voici la nouvelle mise en page de Fragment qui ne fonctionne pas:

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

Il semble que le FrameLayout ajouté provoque ces problèmes, mais je ne suis pas Je ne sais pas pourquoi. Est-ce un problème de conception? ou ai-je oublié quelque chose?

Répondre

2

Bien résolu le problème. Il y a un certain type de bug ou quelque chose d'étrange avec le FloatingActionButton et CoordinatorLayout.

FloatingActionButton.hide() rend la visibilité du bouton GONE. Cela semble provoquer le CoordinatorLayout pour ignorer d'autres événements pour FloatingActionButton. C'est la raison pour laquelle le défilement n'a pas montré le bouton à nouveau.

La solution consistait à s'assurer que la visibilité du FloatingActionButton était définie sur INVISIBLE après avoir appelé FloatingActionButton.hide().

@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

problème fou ... merci de partager cela! –

0

J'ai rencontré le même problème après la mise à jour de la bibliothèque de support vers la version 25.1.0. Si vous définissez la visibilité des vues sur GONE dans votre classe de comportement, ces vues sont maintenant ignorées. Donc, les solutions possibles sont de rétrograder la bibliothèque de support ou mettre à jour votre classe de comportement - faire des vues INVISIBLE au lieu de GONE.

+0

Je ne suis pas sûr que vous avez compris la question? Le problème est en quelque sorte que FrameLayout ajouté ne signale pas les changements de défilement afin que la classe Behavior puisse cacher/afficher correctement le bouton Fab. – Jona