Что такое Android-пространство имен app?

124

Вот пример пространства имен app, которое я видел из файла res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never" />
</menu>

Какую цель выполняет пространство имен app? Является ли это "стандартным" пространством имен Android для Android? Имеются ли одинаковые параметры значений для одного и того же атрибута, помещенного в два разных пространства имен (например, app:showAsAction и android:showAsAction).

Из docs: android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

i.e., будет ли строка в приведенном выше примере означать что-то еще, если атрибут был вместо этого:

android:showAsAction="never"

Похоже, что это может быть какой-то механизм "подкласса", но я не могу найти никакой реальной документации в пространстве имен app из источников Google/Android.

Теги:
android-layout
android-tools-namespace
xml-namespaces

1 ответ

158
Лучший ответ

Пространство имен app не относится к библиотеке, но используется для всех атрибутов, определенных в вашем приложении, будь то по вашему коду или импортируемым библиотекам, эффективно создавая одно глобальное пространство имен для пользовательских атрибутов - то есть атрибуты не определенная системой android.

В этом случае библиотека appcompat-v7 использует пользовательские атрибуты, зеркалирующие пространства имен android: для поддержки предыдущих версий андроида (например: android:showAsAction добавляется только в API11, но app:showAsAction (предоставляется как часть вашего приложения) работает на всех уровнях API, которые делает ваше приложение) - очевидно, использование android:showAsAction не будет работать на уровнях API, где этот атрибут не определен.

  • 1
    Спасибо! Я счастлив, что наконец нашел упоминание об этом в документации. Один дополнительный вопрос, хотя. На панели действий в вашей ссылке написано: «Обратите внимание, что вышеприведенный атрибут showAsAction использует пользовательское пространство имен, определенное в теге <menu>. Это необходимо при использовании любых атрибутов XML, определенных в библиотеке поддержки, поскольку эти атрибуты не существуют в Платформа Android на старых устройствах. Поэтому вы должны использовать свое собственное пространство имен в качестве префикса для всех атрибутов, определенных библиотекой поддержки ».
  • 1
    Так что же происходит на старых устройствах, где атрибуты не существуют в рамках? Мне пока не ясно, как определение настраиваемого пространства имен обходит отсутствующую поддержку атрибута. Означает ли объявление showAsAction в пользовательском пространстве имен, что оно работает showAsAction на более новых платформах и игнорируется на более старых?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню