Пользовательское поведение Android FAB теряет стандартную настройку SnackBar

У меня есть FAB (кнопка с плавающим действием)

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">

...

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fabButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:layout_margin="@dimen/fab_margin"
    app:layout_anchorGravity="bottom|right|end"
    android:src="@drawable/img"
    app:borderWidth="0dp"
    />

Этот FAB существует поверх RecycleView, который я прокручиваю. На определенной стадии прокрутки я показываю SnackBar, и все работает так, как рекламируется (в частности, SnackBar сдвигает FAB, чтобы избежать блокировки.

Теперь я хочу реализовать собственное поведение, которое при прокрутке вниз я хочу скрыть FAB.

Итак, я создал собственное поведение:

public class CustomBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
private int toolbarHeight;

public CustomBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.toolbarHeight = Utils.getToolbarHeight(context);
}

@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
    return dependency instanceof AppBarLayout;
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
    if (dependency instanceof AppBarLayout) {
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
        int fabBottomMargin = lp.bottomMargin;
        int distanceToScroll = fab.getHeight() + fabBottomMargin;
        float ratio = (float)dependency.getY()/(float)toolbarHeight;
        fab.setTranslationY(-distanceToScroll * ratio);
    }
    return true;
}

}

Это в значительной степени скрывает мой FAB, когда я прокручиваю вниз (он скрывается вместе с AppBarLayout, поэтому я добавляю это в свое объявление FAB xml

 app:layout_behavior="com.example.CustomBehavior"

Когда я делаю это, FAB правильно скрывает, но SnackBar перекрывает его, когда показывает. Значение поведения по умолчанию ушло...

Возможно ли иметь оба?

1 ответ

Вам нужно сохранить локальный экземпляр поведения и придерживаться поведения по умолчанию. попробуйте установить поведение по умолчанию обратно, когда снэк-бар отклонен, а затем ваше собственное поведение, когда оно отображается. что-то вроде:

mSnackbar.setCallback(new Snackbar.Callback() {
            @Override
            public void onDismissed(Snackbar snackbar, int event) {
                super.onDismissed(snackbar, event);
                ((CoordinatorLayout.LayoutParams)mSnackbar.getView().getLayoutParams()).setBehavior(/*default behavior*/);
            }

            @Override
            public void onShown(Snackbar snackbar) {
                super.onShown(snackbar);
                ((CoordinatorLayout.LayoutParams)mSnackbar.getView().getLayoutParams()).setBehavior(/*your custom behavior*/);

            }
        });

удачи!

Другие вопросы по тегам