BottomSheetBehaviour: представление не связано с BottomSheetBehavior

Я использую библиотеку поддержки дизайна Google 25.0.0. В своей деятельности у меня есть относительный макет с

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

Теперь, когда я ссылаюсь на него для добавления BottomSheetBehaviour, я получаю ошибку

java.lang.IllegalArgumentException: The view is not associated with BottomSheetBehavior

Вот макет:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/maps_colayout"
xmlns:app="http://schemas.android.com/tools"
android:fitsSystemWindows="true"
android:background="@color/white">

...

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="280dp"
    android:layout_gravity="bottom"
    android:id="@+id/rl_bottomsheet"
    android:background="#F3F3F3"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

    ...

</RelativeLayout>

И вот соответствующий код действия:

CoordinatorLayout colayout = (CoordinatorLayout) findViewById(R.id.maps_colayout);
    View bottomSheet = colayout.findViewById(R.id.rl_bottomsheet);
    BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            // React to state change
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            // React to dragging events
        }
    });

Ответ 1

Вы указали неправильное пространство имен app. Заменить строку:

xmlns:app="http://schemas.android.com/tools"

с

xmlns:app="http://schemas.android.com/apk/res-auto"

в вашем объявлении CoordinatorLayout в файле макета.

Пространство имен tools используется для предоставления дополнительной информации о макете для "инструментов" (например, IDE). Эта информация удаляется из приложения.

С другой стороны app пространство имен app является глобальным пространством имен для всех пользовательских (то есть, не объявленных системой Android) атрибутов, объявленных вами или импортированными библиотеками (в вашем случае используется библиотека поддержки дизайна). Они включены в ваше приложение.

Итак, что на самом деле подходит для tools имен приложений? Наиболее распространенное использование - лучше визуализировать предварительный просмотр макета. Предположим, например, что у вас есть TextView, который должен быть сначала пустым и заполнен позже.

Вы можете добавить атрибут в ваше объявление TextView:

tools:text="Some example text here"

Этот текст не будет отображаться в вашем приложении. Тем не менее, предварительный просмотр макета, представленный в вашем Android Studio, будет иметь его, чтобы вы могли видеть, чего ожидать на своем мобильном устройстве.

Ответ 2

Вам нужно будет добавить эту строку в тэг линейного макета. Тот, на который ссылаются.

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

или для андроида x

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

Ответ 3

Во-первых, если вы используете androidX, то "app:layout_behavior="@string/bottom_sheet_behavior"" или app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

Во-вторых, представление с поведением нижней таблицы должно быть прямым потомком макета координатора.

И наконец, удалите атрибуты layout_width и layout_height этого элемента, если это сделано, Делайте это программно, если это необходимо.

Ответ 4

Я столкнулся с той же проблемой, и когда я попытался найти решение, я нашел это решение (для вашей информации я использую пакеты Android X)

Заменить эту строку:

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

с этим:

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

и я хочу знать, что это обязательно для вызова BottomSheetCallback()?

Скажите, пожалуйста, является ли это обязательным и почему?