Пользовательское поведение CoordinatorLayout с LinearLayout в качестве дочернего элемента

Я хочу реализовать пользовательское поведение в LinearLayout. Это структура моего xml:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout.../>
<android.support.v4.widget.DrawerLayout.../>
 <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_behavior="com.xxx.BottomBarBehavior"
            android:layout_gravity="bottom|center_horizontal".../>
</android.support.design.widget.CoordinatorLayout>

LinearLayout находится внутри CoordinatorLayout, ниже DrawerLayout. LinearLayout не перемещается вверх, когда отображается закусочная. Я просто не могу уложиться в голове. Макет таков, что DrawerLayout содержит ViewPager, и этот viewPager заполняется другим xml фрагментом. А закусочная создается элементом в recyclerView этого фрагмента.

Вот как выглядит мой собственный класс поведения BottomBarBehavior:

public class BottomBarBehavior extends CoordinatorLayout.Behavior<LinearLayout> {
public BottomBarBehavior(Context context, AttributeSet attrs) {}

@Override
public boolean layoutDependsOn(CoordinatorLayout parent, LinearLayout child, View dependency) {
    return ( dependency instanceof Snackbar.SnackbarLayout ) ||
            ( dependency instanceof DrawerLayout );
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, LinearLayout child, View dependency) {
    if( dependency instanceof Snackbar.SnackbarLayout ) {
        float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
        child.setTranslationY(translationY);
    }
    return true;
}

}


person Sid    schedule 07.02.2016    source источник
comment
Очистите и перестройте проект. Ваш layoutDependsOn не имеет ничего общего с ClassCastException. Проверьте, не произойдет ли это снова.   -  person Nikola Despotoski    schedule 07.02.2016
comment
Это сработало! Но мое поведение по-прежнему не отслеживается LinearLayout.   -  person Sid    schedule 07.02.2016
comment
Какой экземпляр CoordinatorLayout вы передаете вызову make() вашего Snackbar?   -  person colithium    schedule 04.10.2016


Ответы (1)


Я думаю, вам просто не хватает super(); в конструкторе BottomBarBehavior.

person eddie    schedule 07.02.2016
comment
Да, я пропустил это. Но даже после установки super() он все равно не работает должным образом. onDependentViewChanged() просто не вызывается при создании закусочной. - person Sid; 07.02.2016
comment
Единственная другая разница между моей рабочей реализацией и вашей: я не проверяю DrawerLayout внутри layoutDependsOn - person eddie; 08.02.2016
comment
Но это вообще не должно иметь значения. Верно? - person Sid; 08.02.2016
comment
Хм.. У меня также есть android:id="@+id/snackbar" в CoordinatorLayout, а затем для его вызова Snackbar sb = Snackbar.make(findViewById(R.id.snackbar), "D'oh", Snackbar.LENGTH_LONG); - person eddie; 08.02.2016
comment
Итак, ваш координаторLayout имеет идентификатор «закусочная»? - person Sid; 08.02.2016
comment
Когда я пытался это сделать, я не мог видеть саму закусочную. - person Sid; 08.02.2016
comment
Мой CoordinatorLayout довольно прост: он содержит только LinearLayout с несколькими представлениями/кнопками. Макеты других действий (просмотр списка и т. д.) находятся за его пределами. Кажется, это работает для меня. Также, пожалуйста, попробуйте удалить DrawerLayout из реализации вашего поведения и посмотрите, поможет ли это (я вижу проблему в onDependentViewChanged, когда метод всегда возвращает true, даже если dependency не относится к типу Snackbar) - person eddie; 08.02.2016
comment
есть ли способ поделиться своим полным xml-файлом + вызовы для вызова Snackbar. Я подозреваю, что BottomBarBehavior даже не был создан. Я рекомендую добавить логирование во все методы поведения, чтобы проверить это. Вы определили xmlns:app="http://schemas.android.com/apk/res-auto"? - person eddie; 08.02.2016
comment
Он определенно создается, потому что я получаю обратные вызовы onDependentViewChanged() при любом изменении DrawerLayouts. - person Sid; 08.02.2016