2016-12-14 24 views
20

próbowałam aktualizowania com.android.support:appcompat i com.android.support:design z: 25.0.1 do 25.1.0, w następujący sposób:Pływający przycisk akcja nie widoczne na przewijanie po aktualizacji Google Wsparcia & Design Library

compile 'com.android.support:appcompat-v7:25.0.1' 
compile 'com.android.support:design:25.0.1' 

do:

compile 'com.android.support:appcompat-v7:25.1.0' 
compile 'com.android.support:design:25.1.0' 

ale odkryłem, że mój ruchomy przycisk akcji nie pojawia się, gdy aktywność jest przewijana. Moja FAB zachowanie jest określona przez następujący:

public class MyFabBehavior extends FloatingActionButton.Behavior { 

    public MyFabBehavior(Context context, AttributeSet attrs) { 
     super(); 
    } 

    @Override 
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, 
             FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { 

     // Ensure we react to vertical scrolling 
     return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL 
       || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); 

    } 

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

     super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); 
     if (dyConsumed < 0) { 
      // User scrolled up -> hide the FAB 
      animateFab(child, View.GONE); 
     } else if (dyConsumed > 0) { 
      // User scrolled down -> show the FAB 
      animateFab(child, View.VISIBLE); 
     } 
    } 

    static public void animateFab(FloatingActionButton fab, int visibility) { 
     // ignore visibility passed in, and just make fab visible regardless 
     if (fab.getVisibility() != View.VISIBLE) { 
      fab.show(); 
     } 
    } 
} 

i mój układ jest następujący:

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <android.support.v4.widget.NestedScrollView 
     android:id="@+id/main_scrollview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="8dp" > 

     ... 

    </android.support.v4.widget.NestedScrollView> 

    <android.support.design.widget.FloatingActionButton 
     app:layout_behavior="com.example.MyFabBehavior" 
     android:id="@+id/fab" 
     app:fabSize="normal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_marginBottom="@dimen/fab_margin" 
     android:layout_marginRight="@dimen/fab_margin" 
     android:onClick="saveButton" 
     app:elevation="6dp" 
     app:pressedTranslationZ="12dp" 
     app:backgroundTint="@color/colorPrimary" 
     android:src="@drawable/ic_done_white_24dp" /> 

</android.support.design.widget.CoordinatorLayout> 

Odpowiedz

1

w CoordinatorLayout 25.1.0 (

for (int i = 0; i < childCount; i++) { 
      final View view = getChildAt(i); 
      if (view.getVisibility() == GONE) { 
       // If the child is GONE, skip... 
       continue; 
      } 

w 25.0.1

for (int i = 0; i < childCount; i++) { 
      final View view = getChildAt(i); 
      final LayoutParams lp = (LayoutParams) view.getLayoutParams(); 
      if (!lp.isNestedScrollAccepted()) { 
       continue; 
      } 

      final Behavior viewBehavior = lp.getBehavior(); 
      if (viewBehavior != null) { 
       viewBehavior.onNestedScroll(this, view, target, dxConsumed, dyConsumed, 
         dxUnconsumed, dyUnconsumed); 
       accepted = true; 

     } 
+0

W 'onCreate()' 'Activity' mojego I mów' hide() 'na' FloatingActionButton', aby zaczął się ukrywać, a następnie pojawiał się podczas przewijania (poprzez zdefiniowane zachowanie).Czy wywołanie 'hide()' ustawia jego widoczność na "GONE" i czy twój fragment kodu sugeruje, że zmienny przycisk akcji jest zignorowany podczas przewijania? Na pewno nie? – drmrbrewer

53

Aktualizacja z pomocy technicznejdo 25.1.0 zmienia metodę onNestedScroll dla połączenia, które jest pomijane dla widoków, których widoczność jest ustawiona na View.GONE.

Wywołanie child.hide() na pływającej przycisku akcji ustawia widoczność widoku do View.GONE, co oznacza, obecnie (od 25.1.0), wywołanie onNestedScroll metoda zostanie pominięty na pływającym przycisku akcji w przyszłości (bo pomija wszystkie widoki którego widoczność to GONE).

Rozwiązaniem tego problemu może być ustawienie widoczności widoku na INVISIBLE, gdy się go ukryje. W ten sposób, onNestedScroll nie będzie pomijał widoku następnym razem, gdy wykonywany jest zagnieżdżony zwój.

W tym celu można zadzwonić

child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
      /** 
      * Called when a FloatingActionButton has been hidden 
      * 
      * @param fab the FloatingActionButton that was hidden. 
      */ 
      @Override 
      public void onHidden(FloatingActionButton fab) { 
       super.onShown(fab); 
       fab.setVisibility(View.INVISIBLE); 
      } 
     }); 

w swojej metodzie onNestedScroll.

Edit: Problem ten został przedłożony Emisji Tracker AOSP na https://code.google.com/p/android/issues/detail?id=230298

+5

Uratowałeś mi moją pracę. Dziękuję Ci! –

+1

Wow, to jest szalone !, znaleźliśmy ten sam problem z aktualizacją do 25.1.1 ", dziękuję za sugestię. – Jorgesys

+1

Wygląda jak literówka w metodzie zastąpienia. Powinien być "super.onHidden (fab)". – Anthonyeef

0

zachowanie zmieniło się od wsparcia lib wersji 25.1.0.

To musi być widok RecyclerView (zachowanie), który wyzwala zmianę widoczności FAB.

Innymi słowy, nie jest już obowiązkiem obiektu, który chce reagować na zachowanie, ale na obiekcie, który porusza się, aby być świadomym wszystkiego na ekranie.

Poniżej znajduje się link do diff, który pokazuje zmiany, które są wymagane do przeprowadzenia uaktualnienia:

https://github.com/chrisbanes/cheesesquare/compare/master...ianhanniballake:scroll_aware_fab