Что такое пространство приложений Android для Android?

Вот пример пространства имен 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.

Ответ 1

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

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

Ответ 2

Вы можете получить некоторые объяснения по этой ссылке

Пространство имен XML

Объявление пространства имен. Пространство имен XML объявляется с использованием зарезервированного атрибута XML xmlns или xmlns: prefix, значением которого должно быть допустимое имя пространства имен.

Например, следующее объявление отображает префикс "xhtml:" в пространство имен XHTML:

XMLNS: = XHTML "http://www.w3.org/1999/xhtml"

Любой элемент или атрибут, чье имя начинается с префикса "xhtml:", считается находящимся в пространстве имен XHTML, если он или его предок имеют вышеуказанное объявление пространства имен.

Также возможно объявить пространство имен по умолчанию. Например:

XMLNS = "http://www.w3.org/1999/xhtml"

В этом случае любой элемент без префикса пространства имен считается находящимся в пространстве имен XHTML, если он или его предок имеют вышеуказанное объявление пространства имен по умолчанию.

Если в области нет объявления пространства имен по умолчанию, имя пространства имен не имеет значения. [6] В этом случае считается, что элемент без явного префикса пространства имен не находится ни в одном пространстве имен.

Атрибуты никогда не подчиняются пространству имен по умолчанию. Атрибут без явного префикса пространства имен считается не входящим ни в какое пространство имен.