android - Activity 中的 float 操作按钮 - 如何锚定到 fragment 中的回收 View ?

标签 android android-fragments android-viewpager android-recyclerview floating-action-button

我在这个问题上遇到了同样的问题Floating Action Button not showing fully inside a fragment

我的 activity_main 中有一个 tablayout 和 2 个选项卡(有不同的 fragment ,其中一个包含一个 recyclerView)。当我将 FAB 放入 fragment 中时,直到我向下滚动 recyclerView 时,FAB 才完全显示出来。

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

通过这种方式,我在 Activity 中有一个 FAB 而不是在 fragment 中,我想知道如何锚定,例如,我的 fab 到 fragment 中的 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>

最佳答案

您是否尝试过将其锚定到 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 来响应 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

关于android - Activity 中的 float 操作按钮 - 如何锚定到 fragment 中的回收 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31092787/

相关文章:

android - Android 中的 MessageBox 等价物?

android - Android NDK音频回调

android - 类型不匹配 : cannot convert from ListFragment to Fragment

android - 在父Activity的onBackPressed方法中调用Fragment接口(interface)方法

android - 如何解决软键盘显示/隐藏工作缓慢?

java - ClipDrawable getDrawable() 返回一个 StateListDrawable

Android Studio - 'anim' 文件夹在哪里?

google-maps - scrollivew 内的 mapview 片段闪烁

按下后退按钮后 Android ViewPager 异常

Android ViewPager 根据屏幕尺寸显示多个 fragment