Що таке "ім'я" додатка Android XML?


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.

Відповіді:


213

appПростір імен не є специфічним для бібліотеки, але вона використовується для всіх атрибутів , визначених у додатку, будь то ваш код або бібліотеки імпорту, ефективно роблячи єдине глобальне простір імен для призначених для користувача атрибутів - тобто, атрибути не визначені андроїда системи .

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


1
Дякую! Я щасливий, що нарешті знайшов згадку про це в документації. Хоча одне наступне питання. Документи рядка дій у вашому посиланні говорять: "Зауважте, що вищевказаний атрибут showAsAction використовує спеціальний простір імен, визначений у тезі <menu>. Це необхідно при використанні будь-яких атрибутів XML, визначених бібліотекою підтримки, оскільки ці атрибути не існують у Рамка Android на старих пристроях. Тому ви повинні використовувати власний простір імен як префікс для всіх атрибутів, визначених бібліотекою підтримки. "
coder123

1
То що відбувається на старих пристроях, де атрибути не існують у рамках? Мені поки не зрозуміло, як визначає користувацьку область імен навколо відсутньої підтримки атрибута. Чи означає оголошення showAsActionв користувацькому просторі імен, як воно працює, як очікувалося, на нових платформах і ігнорується на старих?
coder123

4
Атрибути, які не існують, мовчки ігноруються. Створюючи спеціальний атрибут, ви гарантуєте, що спеціальний атрибут буде існувати під час виконання (очевидно: його визначення включено у ваш додаток). Тому бібліотека підтримки використовує власні атрибути, щоб їх власний код для створення меню міг використовувати єдиний шлях коду, який працює у всіх версіях API, по суті замінюючи будь-яку потребу у використанні android:версій.
ianhanniballake

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: префікса, значення якого повинно бути дійсним іменем простору імен.

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

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

Будь-який елемент або атрибут, ім'я якого починається з префіксу "xhtml:", вважається в просторі імен XHTML, якщо в ньому або у предка є вищевказане оголошення простору імен.

Можна також оголосити простір імен за замовчуванням. Наприклад:

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

У цьому випадку будь-який елемент без префікса простору імен вважається в просторі імен XHTML, якщо у нього або у предка вказана вище декларація простору імен за замовчуванням.

Якщо в області застосування немає декларації простору імен за замовчуванням, ім'я простору імен не має значення. [6] У цьому випадку вважається, що елемент без явного префіксу простору імен не міститься в жодному просторі імен.

Атрибути ніколи не підлягають простору імен за замовчуванням. Атрибут без явного префіксу простору імен вважається відсутнім у будь-якому просторі імен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.