Как переопределить CoordinatorLayout.Behavior, не нарушая CoordinatorLayout.LayoutParams - PullRequest
0 голосов
/ 06 апреля 2019

Я создаю приложение для Android и хочу скрыть BottomAppBar (на нем закреплен ярлык в центре) всякий раз, когда я прокручиваю RecyclerView, который находится внутри фрагмента моей деятельности, без изменения макета BottomAppBar.

Следуя некоторым интерактивным руководствам, я создал свой собственный класс, который расширяет CoordinatorLayout.Behavior и переопределяет onStartNestedScroll & onNestedPreScroll, так что BottomAppBar скрывается при каждой прокрутке.

<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 Ответ

1 голос
/ 06 апреля 2019

Я только просмотрел исходный код, но вырез рисунка является частью значения по умолчанию BottomAppBar.Behavior.

Лучше всего, чтобы пользовательское поведение расширяло его вместо пустого CoordinatorLayout.Behavior (или хотя бы скопируйте соответствующий код для рисования выреза) и продолжайте свой путь оттуда.

Кстати, app:hideOnScroll ( связанный вопрос ) не работает для Вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...