web-dev-qa-db-ja.com

アクティビティ内のフローティングアクションボタン-フラグメント内のrecyclerviewにアンカーする方法は?

この質問でも同じ問題が発生しました フローティングアクションボタンがフラグメント内に完全に表示されない

Activity_mainにtablayoutがあり、2つのタブがあります(フラグメントが異なり、そのうちの1つにはrecyclerViewが含まれています)。 FABをフラグメントに入れると、recyclerViewを下にスクロールするまでFABが完全に表示されませんでした。

そのため、リンクされた質問で提案されているように、coordinator_layoutウィジェットのactivity_main.xmlファイルにFABを移動しましたが、正常に機能します。

このようにして、フラグメントではなくアクティビティにFABがあり、たとえば、ファブをフラグメント内のリサイクラービューにアンカーする方法を知りたいのですが、たとえば、リサイクラーのスクロール中にアニメーション化させますか?

今度はtablayoutを含むactivity_main.xml:

activity_main.xml

<Android.support.design.widget.CoordinatorLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbarlayout1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fitsSystemWindows="true" >

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar1"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            Android:background="?attr/colorPrimary" />

        <Android.support.design.widget.TabLayout
            Android:id="@+id/tabLayout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/toolbar1"
            Android:background="?attr/colorPrimary"
            Android:scrollbars="horizontal"
            app:tabMode="scrollable" />

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v4.view.ViewPager
        Android:id="@+id/viewpager"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />


    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentRight="true"
        Android:layout_gravity="bottom|right"
        Android:layout_marginBottom="20dp"
        Android:layout_marginRight="20dp"
        Android:src="@drawable/ic_action_location_found"
        app:fabSize="normal" />
    </Android.support.design.widget.CoordinatorLayout>

fragment.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="@dimen/activity_vertical_margin" >

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/my_recycler_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_below="@+id/start_button"
        Android:scrollbars="vertical" />


</RelativeLayout>
10
ozzem

ビューページャーに固定してみましたか?

<Android.support.design.widget.FloatingActionButton
    Android:id="@+id/fab"
    app:layout_anchor="@id/viewpager"
    app:layout_anchorGravity="bottom|right|end"
</Android.support.design.widget.CoordinatorLayout>

次に、FloatingActionButton.Behaviorを拡張して、CoordinatorLayoutイベントに応答します。

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {

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

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
                                   FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
    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 && child.getVisibility() == View.VISIBLE) {
            child.hide();
         } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
             child.show();
         }
     }

 }

そして、これをFloatingButtonに追加します。

app:layout_behavior="com.package.yourapp.ScrollAwareFABBehavior"

それはここでよく説明されています:

https://guides.codepath.com/Android/Floating-Action-Buttons

11
petrusgomes

補完 @ petrusgome's 回答:

提供されたソリューションは私にはうまくいきませんでした。 recyclerviewリストを下にスクロールした後、FABが再び表示されないという問題がありました。これを修正するには、child.hide()を次のコードに置き換える必要がありました。

child.hide(new FloatingActionButton.OnVisibilityChangedListener() {
    @Override
    public void onHidden(FloatingActionButton fab) {
        super.onHidden(fab);
        fab.setVisibility(View.INVISIBLE);
    }
});

完全な説明はここにあります: スクロールの問題

2
Henrique