2017-01-13 11 views
7

yeniden görünmüyor Kaydını recyclerview ve floating action button bir Android uygulaması yaptım. Aşağı kaydırırken, düğme gizlenmeli, yukarı kaydırırken tekrar gösterilmelidir. Davranışı uygulamak için this tutorial kullanmıştım.Dikkatlice FAB gizler, ancak

sonuç aşağı kaydırırken FAB gizlediği, ancak yukarı kaydırma o yeniden görünmüyor tekrar sınıf ScrollAwareFABBehavior öğreticisindeki aynıdır :(. Ama iç içe düzenleri kullanıyorum. Burada

benim düzenidir (recyclerviewcontent_main bir LinearLayout içindedir):

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="org.myorganisation.mypackage.someActivity"> 

    <include layout="@layout/toolbar" /> 

    <include layout="@layout/content_main" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/add_fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@drawable/plus" 
     app:layout_behavior="org.myorganisation.mypackage.someActivity.helpers.ScrollAwareFABBehavior" /> 

    <LinearLayout 
     android:id="@+id/insert_alert" 
     android:layout_width="wrap_content" 
     android:layout_height="50sp" 
     android:layout_margin="@dimen/fab_margin" 
     android:gravity="center_vertical" 
     android:orientation="horizontal" 
     android:paddingEnd="70sp" 
     android:visibility="gone" 
     app:layout_anchor="@id/add_fab" 
     app:layout_anchorGravity="bottom|left"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical" 
      android:text="@string/initial_alert" 
      android:textColor="@color/colorPrimaryDark" 
      android:textStyle="bold|italic" /> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_keyboard_arrow_right_black_24sp" 
      android:tint="@color/colorPrimary" /> 
    </LinearLayout> 

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

cevap

3

Destek Kütüphanesi sürümü 25.1.0 itibariyle gizli görünümleri artık this bug uyarınca olayları kaydırma

. comment #5 belirtildiği

gibi:

Bu olması gerektiği gibi çalıştığından sizin bağımlılık zincir yanlış bir yoldur. RecyclerView'ınız (Davranış), FAB görünürlük değişimini tetiklemelidir.

+1

Teşekkürler. '25.0.1' değerine düşürülmesi onu çözdü;) – Yonjuni

+1

Ayrıca, hata tarafından önerilen yaklaşıma da geçebilirsiniz - burada bir örnek var (https: //github.com/chrisbanes/cheesesquare/compare/master ... ianhanniballake: scroll_aware_fab) – ianhanniballake

+0

@ianhanniballake yeni çözümün bir sorunu var, liste görünüm portunu doldurursa, fab'ı gizlemez. Bu muhtemelen isteniyor olsa da, fab, listedeki son öğeyi kaplayabilir. Herhangi bir fikir nasıl çözülür? Sadece bu durumda fab yukarıdaki içeriği kaydırmak için benim liste için alt bir dolgu eklemekten kaçınmak istiyorum ... – prom85

1

ben .hide (true) ile (doğru) ve .setVisibility (View.GONE) .Show ile .setVisibility (View.VISIBLE) değiştirerek bu sorunu çözdü:

Ve burada benim olayım 25.1.0 ile çalışan Davranış için sınıf,: ve Clans FloatingActionButton

public class ScrollAwareFABBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { 
private static boolean mIsAnimatingOut = false; 
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); 

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

@Override 
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fabButton, View dependency) { 
    return dependency instanceof Snackbar.SnackbarLayout; 
} 

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fabButton, View dependency) { 
    float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); 
    fabButton.setTranslationY(translationY); 
    return true; 
} 

@Override 
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, 
            FloatingActionButton fabButton, View directTargetChild, View target, int nestedScrollAxes) { 
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || 
      super.onStartNestedScroll(coordinatorLayout, fabButton, directTargetChild, target, 
        nestedScrollAxes); 

} 

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

    if (fabButton.isEnabled()) { 
     if (dyConsumed > 0 && !mIsAnimatingOut && fabButton.isShown()) { 
      animateOut(fabButton); 
     } else if ((dyConsumed < 0 || dyUnconsumed < 0) && fabButton.isHidden()) { 
      animateIn(fabButton); 
     } 
    } 
} 

public static void animateOut(final FloatingActionButton fabButton) { 
    if (Build.VERSION.SDK_INT >= 14) { 
     ViewCompat.animate(fabButton).translationY(168F).alpha(0.0F).setInterpolator(INTERPOLATOR).withLayer() 
       .setListener(new ViewPropertyAnimatorListener() { 
        public void onAnimationStart(View view) { 
         mIsAnimatingOut = true; 
        } 

        public void onAnimationCancel(View view) { 
         mIsAnimatingOut = false; 
        } 

        public void onAnimationEnd(View view) { 
         mIsAnimatingOut = false; 
         fabButton.hide(true); 
        } 
       }).start(); 
    } else { 
     Animation anim = AnimationUtils.loadAnimation(fabButton.getContext(), android.R.anim.fade_in); 
     anim.setInterpolator(INTERPOLATOR); 
     anim.setDuration(200L); 
     anim.setAnimationListener(new Animation.AnimationListener() { 
      public void onAnimationStart(Animation animation) { 
       mIsAnimatingOut = true; 
      } 

      public void onAnimationEnd(Animation animation) { 
       mIsAnimatingOut = false; 
       fabButton.hide(true); 
      } 

      @Override 
      public void onAnimationRepeat(final Animation animation) { 
      } 
     }); 
     fabButton.startAnimation(anim); 
    } 
} 

public static void animateIn(FloatingActionButton fabButton) { 
    fabButton.show(true); 
    if (Build.VERSION.SDK_INT >= 14) { 
     ViewCompat.animate(fabButton).translationY(0).scaleX(1.0F).scaleY(1.0F).alpha(1.0F) 
       .setInterpolator(INTERPOLATOR).withLayer().setListener(null) 
       .start(); 
    } else { 
     Animation anim = AnimationUtils.loadAnimation(fabButton.getContext(), android.R.anim.fade_out); 
     anim.setDuration(200L); 
     anim.setInterpolator(INTERPOLATOR); 
     fabButton.startAnimation(anim); 
    } 
} 

} destek kitaplığı sürümü 25.1.0 gelince