Нижняя прокладка FAB исчезает, когда появляется Snackbar

Мойн,

У меня странное поведение с FAB внутри CoordinatorLayout.
Когда появляется Snackbar, FAB скользит вверх, но прилипает прямо к Snackbar без padding (второе изображение).
После того, как Snackbar исчезает, FAB перемещается вниз к краю экрана без отступов (третье изображение) до тех пор, пока через несколько секунд FAB волшебным образом снова не перемещается вверх (перепроверка макета?), а отступы возвращаются в нормальное состояние (четвертое изображение).

Я тестировал это с API 16 по 23.

шаг1

шаг 2

шаг 3

step4

Мой макет выглядит так:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/pullToRefreshContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <LinearLayout
            android:id="@+id/empty"
            [...]
        </LinearLayout>


        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fabAdd"
            style="@style/MyTheme.FloatingActionButton"
            app:layout_anchor="@id/recycler"
            app:layout_anchorGravity="bottom|right|end"
            app:useCompatPadding="true"/>

    </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout>

Соответствующая тема выглядит так:

<style name="MyTheme.FloatingActionButton" parent="Widget.Design.FloatingActionButton">
    <item name="android:layout_width">56dp</item>
    <item name="android:layout_height">56dp</item>
    <item name="android:layout_gravity">bottom|right</item>
    <item name="android:layout_marginRight">6dp</item>
    <item name="android:scaleType">center</item>
</style>

Кто-нибудь знает, что вызывает такое поведение? Я хочу, чтобы FAB всегда сохранял свою padding.


person Marty    schedule 13.02.2017    source источник


Ответы (1)


Недавно столкнулся с такой же проблемой. TL;ДР; Я решил это:

public class MyFabBehavior extends FloatingActionButton.Behavior {
    public MyFabBehavior() {
        super();
    }

    public MyFabBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean getInsetDodgeRect(
            @NonNull CoordinatorLayout parent,
            @NonNull FloatingActionButton child,
            @NonNull Rect rect) {
        return false;
    }
}

Объяснение:

CoordinatorLayout позволяет своим дочерним элементам устанавливать dodgeInsetEdges. Это значение гравитации. Без этого параметра всякий раз, когда другой дочерний элемент перемещается в прямоугольник нашего представления, они перекрываются. Однако с установленным dodgeInsetEdges CoordinatorLayout будет перемещать наше представление, чтобы избежать перекрытия с указанного направления. Значение по умолчанию для FAB — нижнее.

Более того, CoordinatorLayout позволяет нам вместо использования прямоугольника представления определять свой собственный. Это можно сделать, переопределив getInsetDodgeRect в нашем поведении. FAB делает это, и здесь начинается проблема.

На устройствах до Lollipop или когда для параметра useCompatPadding установлено значение true, FAB будет добавлять отступы, используемые для отрисовки тени. Это необходимо, так как на представлениях pre-Lollipop нельзя отрисовывать тень за их пределами.

Согласно комментариям в поведении FAB по умолчанию, после добавления теневого заполнения FAB должен сместиться обратно в исходное положение. Однако этого не происходит. С другой стороны, прямоугольник вставки dodge по-прежнему смещен, и поэтому FAB подталкивается вверх после того, как Snackbar покрывает тень, а затем перетаскивается полностью вниз. Приведенное выше решение в основном возвращает его по умолчанию.

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

person Marcin Jedynak    schedule 25.04.2017