活动中的浮动操作按钮 - 如何在片段中固定到recyclerview?

问题描述:

我有同样的问题,在这个问题Floating Action Button not showing fully inside a fragment活动中的浮动操作按钮 - 如何在片段中固定到recyclerview?

我有我的activity_main和2个选项卡的tablayout(使用不同的片段,其中一个包含recyclerView)。当我将FAB放入片段时,直到我滚动回收器视图时,FAB才完全显示出来。

因此,我按照链接问题中的建议,将我的FAB移动到coordinator_layout小部件的activity_main.xml文件中,并且效果很好。

以这种方式,我在活动中有一个FAB,而不是在片段中,我想知道如何将我的fab锚定到片段中的recyclerview,例如让它在回收站中动画化滚动?

现在有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> 
+0

请问一个具体问题。如果这是一个答案,请输入它作为答案。 –

你已经尝试过了锚的viewpager?

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

补全@petrusgome's回答:

提供的解决方案对我无效。在滚动回收站查看列表后,我遇到了FAB不会再显示的问题。 要解决它,我只是用下面的代码替换child.hide()

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

完整的解释可以在这里找到:scrolling issue