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

164

Вот пример 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 XML? Доступны ли одинаковые параметры значения для одного и того же атрибута в двух разных пространствах имен (например, app:showAsActionи android:showAsAction).

Из документов : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

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

android:showAsAction="never"

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

coder123
источник

Ответы:

213

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

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

ianhanniballake
источник
1
Спасибо! Я счастлив, что наконец нашел упоминание об этом в документации. Один дополнительный вопрос, хотя. На панели действий в вашей ссылке сказано: «Обратите внимание, что атрибут showAsAction выше использует настраиваемое пространство имен, определенное в теге <menu>. Это необходимо при использовании любых атрибутов XML, определенных библиотекой поддержки, поскольку эти атрибуты не существуют в Платформа Android на старых устройствах. Поэтому вы должны использовать свое собственное пространство имен в качестве префикса для всех атрибутов, определенных библиотекой поддержки. "
coder123
1
Так что же происходит на старых устройствах, где атрибуты не существуют в платформе? Мне еще не ясно, как определение настраиваемого пространства имен работает вокруг отсутствующей поддержки атрибута. Означает ли объявление showAsActionв пользовательском пространстве имен, что оно работает должным образом на новых платформах и игнорируется на старых?
coder123
4
Атрибуты, которые не существуют, молча игнорируются. При создании пользовательского атрибута вы гарантируете, что пользовательский атрибут будет существовать во время выполнения (очевидно: его определение включено в ваше приложение). Поэтому библиотека поддержки использует настраиваемые атрибуты, так что их пользовательский код для построения меню может использовать единый путь кода, который работает во всех версиях API, по существу заменяя любую необходимость использования android:версий.
января
2
Извините, если я не просто не понимаю. Можете ли вы помочь мне понять, как простое изменение пространства имен обеспечивает определение атрибута? Если showAsNameатрибут не поддерживается в старой библиотеке, как же с помощью пользовательского пространства имен позволяют платформе знать диапазон вариантов возможного значения ( ifRoom, neverи т.д.), и знать , как интерпретировать эти варианты? Я предполагаю, что «атрибуты, которые не существуют» означает атрибуты, для которых не существует реализации в библиотеке. Перестановка android:для app:едва ли кажется полным обходным. Я что-то упускаю?
coder123
14
Он состоит из двух частей: 1) пользовательский атрибут ( app:showAsName) и все его возможные значения включаются в ваше приложение, когда вы включаете appcompat-v7библиотеку (которая определяет его в своем attrs.xmlфайле). 2) Библиотека AppCompat (в частности, ActionMenuView, которая автоматически используется при вашем использовании ActionBarActivity) анализирует и использует, app:showAsActionчтобы правильно отображать элементы одинаково на всех уровнях API. Это, безусловно, требует как XML, так и кода для совместной работы.
ianhanniballake
0

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

Пространство имен 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] В этом случае считается, что элемент без явного префикса пространства имен не находится ни в одном пространстве имен.

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

КИРПАЛ СИНГХ
источник