2017-01-13 5 views
7

recyclerviewfloating action buttonのAndroidアプリを作成しました。下にスクロールすると、スクロールアップが再び表示されるはずです。私はこの動作を実装するためにthis tutorialを使用しました。スクロール対応のFABは非表示になりますが、再表示されません

結果は、私は下にスクロールするときFABが非表示になりますが、スクロールアップするとき、それは再び再表示されていないこと、である:(クラスScrollAwareFABBehaviorはチュートリアルからの同一である。しかし、私は、ネストされたレイアウトを使用しています。

ここ私のレイアウトがある(recyclerviewcontent_mainLinearLayoutである):

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

答えて

3

サポートライブラリのバージョン25.1.0のとおり、隠されたビューは、もはやthis bugごとなどのイベントをスクロールしない

comment #5のように:

これは意図したとおりに動作していますが、依存関係のチェーンが間違っています。 RecyclerView(ビヘイビア)は、FABの可視性の変更をトリガする必要があります。

+1

ありがとうございました。 )「25.0.1」にダウングレードして解決しました;) – Yonjuni

+1

バグで推奨されるアプローチに切り替えることもできます。[here](https://github.com/chrisbanes/cheesesquare/compare/master ...)の例がありますianhanniballake:scroll_aware_fab) – ianhanniballake

+0

@ianhanniballake新しいソリューションに問題があり、リストがビューポートを満たしていればファブを隠すことはありません。これはおそらくファブがリストの最後の項目をオーバーレイする可能性があるためです。任意のアイデアをどのように解決するには?この場合、fabの上にあるコンテンツをスクロールできるように、リストにボトムパディングを追加しないでください。 – prom85

1

私は.hide(真)と.SHOW(真)と .setVisibility(View.GONE)と .setVisibility(View.VISIBLE)を置き換えることで、この問題を解決:

そして、ここは私です25.1.0で動作する行動のためのクラス、:およびサポートライブラリのバージョンについては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); 
    } 
} 

}

関連する問題