如何在不破坏CoordinatorLayout.LayoutParams的情况下覆盖CoordinatorLayout.Behavior

时间:2019-04-05 21:36:19

标签: java android android-coordinatorlayout android-bottomappbar

我正在创建一个Android应用程序,并且每当我滚动活动范围内的BottomAppBar时都想隐藏RecyclerView(它的中心固定有一个fab),而无需更改BottomAppBar的布局。

根据一些在线指南,我创建了自己的类,该类扩展了CoordinatorLayout.Behavior并覆盖了onStartNestedScrollonNestedPreScroll,以便在滚动时BottomAppBar被隐藏。 / p>

<android.support.design.widget.CoordinatorLayout ...>
    ...
    <android.support.design.bottomappbar.BottomAppBar
        style="@style/Widget.MaterialComponents.BottomAppBar"
        android:id="@+id/bottom_app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:backgroundTint="@color/colorPrimary"
        app:fabAlignmentMode="center"
        app:fabCradleRoundedCornerRadius="15dp"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_add_white_24dp"
        app:layout_anchor="@id/bottom_app_bar" />
</android.support.design.widget.CoordinatorLayout>
BottomAppBar bab = (BottomAppBar) findViewById(R.id.bottom_app_bar);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) bab.getLayoutParams();
BottomNavigationBehavior bnb = new BottomNavigationBehavior();
layoutParams.setBehavior(bnb);



class BottomNavigationBehavior<V extends View> extends CoordinatorLayout.Behavior<V>{

    @Override
    public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
        return axes == ViewCompat.SCROLL_AXIS_VERTICAL;
    }

    @Override
    public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        child.setTranslationY(Math.max(0f, Math.min(child.getHeight(),child.getTranslationY() + dy)));
    }
}

没有自定义类,这是(期望的)结果(但是滚动隐藏行为显然不起作用)

Desired layout

对于自定义类,这是(不需要的)结果(但是滚动隐藏行为确实起作用)

Undesired layout

我认为,由于我不是在修改layoutParams参数,而是仅在行为上,布局应该是相同的,但是显然我缺少一些东西...
有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我只浏览了源代码,但是图形切口是默认BottomAppBar.Behavior的一部分。

最好的选择是让您的自定义行为扩展它,而不是空的CoordinatorLayout.Behavior(或至少复制相关代码以绘制图纸)并从此开始。

顺便说一句,app:hideOnScrollrelated question)对您不起作用吗?