Как BottomSheetBehavior_Layout_behavior_hideable преобразуется в app:behavior_hideable?

В документации Android для BottomSheetBehavior говорится, что я может использовать следующий атрибут в XML:

BottomSheetBehavior_Layout_behavior_hideable

Я пробовал это:

android:BottomSheetBehavior_Layout_behavior_hideable="true"

Но это дало мне следующую ошибку:

Неизвестный атрибут android:BottomSheetBehavior_Layout_behavior_hideable

Эта ошибка обсуждается в Неизвестный атрибут android:layout_width, layout_height , id,gravity,layout_gravity,padding, но ни одно из этих решений не сработало для меня, потому что они были связаны с синхронизацией файлов проекта. Мои синхронизируются. Никто не подвергал сомнению правильность имени атрибута, и я думаю, что это моя проблема.

Затем я попробовал это:

app:BottomSheetBehavior_Layout_behavior_hideable="true"

Но это дало мне следующую ошибку:

Для тега обнаружен неожиданный префикс пространства имен «приложение»

Эта ошибка обсуждается в Неожиданное приложение префикса пространства имен найдено для тега RelativeLayout - Android? но ни одно из этих решений не сработало для меня, и, что более важно в моем вопросе, атрибут выглядит следующим образом:

app:behavior_hideable="true"

Является ли app:behavior_hideable правильным способом написания BottomSheetBehavior_Layout_behavior_hideable? Как называется механизм, выполняющий эту трансляцию? Где его документация?


person Michael Osofsky    schedule 30.10.2018    source источник


Ответы (1)


Есть несколько компонентов ответа.

  1. В конструкторе для BottomSheetBehavior атрибуты xml считываются следующим образом: Источник:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BottomSheetBehavior_Layout); setHideable(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_hideable, false));

  1. Эти атрибуты обычно определяются в файле attrs.xml file. Вот attrs.xml для BottomSheetBehavior.

Итак, здесь происходит LayoutInflater, вызывающий конструктор, а доступ к атрибутам xml осуществляется через R.styleable.[name_of_style]_[name_of_attribute]. Если вы хотите применить стиль в XML, вы просто используете имя атрибута. В этом случае имя стиля — «BottomSheetBehavior_Layout», а имя атрибута — «behavior_hideable». Точно так же вы также можете использовать «behavior_skipCollapsed» и «behavior_fitToContents».

Для получения дополнительной информации о стилях официальная документация находится здесь: https://developer.android.com/training/custom-views/create-view#customattr

person chessdork    schedule 30.10.2018
comment
Спасибо, это полезная информация. Так является ли app: правильным префиксом? Из предоставленной вами официальной ссылки на документы я могу сказать, что android: не является правильным префиксом, потому что он говорит «Вместо принадлежности к schemas.android.com/apk/res/android, они принадлежат schemas.android.com/apk/res/[название вашего пакета]. Однако почему app: должно быть правильным пространством имен, если я не создал github.com/material-components/material-components-android/blob/ ? Какое правильное пространство имен? - person Michael Osofsky; 30.10.2018
comment
@MichaelOsofsky Вот хороший ответ stackoverflow.com/a/26692768/3781068. По сути, поскольку BottomSheetBehavior находится в библиотеке поддержки, а не в ванильном андроиде, он использует пространство имен приложения. В общем, если он доступен через зависимость gradle, вам нужно использовать app:, в противном случае вернуться к android: - person chessdork; 30.10.2018