Qu'est-ce que l'espace de noms XML Android «app»?

164

Voici un exemple de l' appespace de noms que j'ai vu à partir d'un res/menu/main.xmlfichier

<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>

À quoi sert l' appespace de noms? S'agit-il d'un espace de noms XML Android "standard"? Les mêmes options de valeur sont-elles disponibles pour le même attribut placé dans deux espaces de noms différents (par exemple app:showAsActionet android:showAsAction).

À partir de la documentation : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

autrement dit, la ligne de l'exemple ci-dessus signifierait-elle autre chose si l'attribut était à la place:

android:showAsAction="never"

On dirait presque qu'il pourrait s'agir d'une sorte de mécanisme de "sous-classification", mais je n'arrive pas à trouver de véritable documentation sur l' appespace de noms à partir de sources Google / Android.

coder123
la source

Réponses:

213

L' appespace de noms n'est pas spécifique à une bibliothèque, mais il est utilisé pour tous les attributs définis dans votre application, que ce soit par votre code ou par les bibliothèques que vous importez, créant ainsi un espace de noms global unique pour les attributs personnalisés, c'est-à-dire les attributs non définis par le système Android. .

Dans ce cas, la appcompat-v7bibliothèque utilise des attributs personnalisés reflétant android:ceux de l' espace de noms pour prendre en charge les versions précédentes d'Android (par exemple: android:showAsActionn'a été ajouté que dans API11, mais app:showAsAction(fourni dans le cadre de votre application) fonctionne à tous les niveaux d'API de votre application) - évidemment l'utilisation de android:showAsActionne fonctionnerait pas sur les niveaux d'API où cet attribut n'est pas défini.

ianhanniballake
la source
1
Je vous remercie! Je suis heureux d'avoir enfin trouvé une mention à ce sujet dans la documentation. Une question complémentaire, cependant. La documentation de la barre d'action dans votre lien indique: "Notez que l'attribut showAsAction ci-dessus utilise un espace de noms personnalisé défini dans la balise <menu>. Ceci est nécessaire lorsque vous utilisez des attributs XML définis par la bibliothèque de support, car ces attributs n'existent pas dans le Framework Android sur les appareils plus anciens. Vous devez donc utiliser votre propre espace de noms comme préfixe pour tous les attributs définis par la bibliothèque de support. "
coder123
1
Alors, que se passe-t-il sur les appareils plus anciens où les attributs n'existent pas dans le framework? Je ne vois pas encore clairement comment la définition d'un espace de noms personnalisé fonctionne autour du support manquant pour un attribut. La déclaration showAsActionsous un espace de noms personnalisé signifie-t-elle que cela fonctionne comme prévu sur les nouvelles plates-formes et est ignoré sur les plus anciennes?
coder123
4
Les attributs qui n'existent pas sont ignorés en silence. Lorsque vous créez un attribut personnalisé, vous garantissez que l'attribut personnalisé existera au moment de l'exécution (évidemment: sa définition est incluse avec votre application). Par conséquent, la bibliothèque de prise en charge utilise des attributs personnalisés afin que leur code personnalisé pour la création de menus puisse utiliser un chemin de code unique qui fonctionne sur toutes les versions d'API, remplaçant essentiellement tout besoin d'utiliser les android:versions.
ianhanniballake
2
Je suis désolé si je ne comprends pas simplement. Pouvez-vous m'aider à comprendre comment la simple modification de l'espace de noms fournit une définition pour un attribut? Si l' showAsNameattribut est pas pris en charge dans une ancienne bibliothèque, comment le fait d' utiliser un espace de noms personnalisés permettre la plate - forme de connaître la gamme d'options de valeur possible ( ifRoom, never, etc.), et savoir comment interpréter ces options? Je suppose que «attributs qui n'existent pas» signifie des attributs pour lesquels il n'existe aucune implémentation dans la bibliothèque. Changer android:pour app:ne semble guère être une solution de contournement complète. Est-ce que je manque quelque chose?
coder123
14
Il y a deux parties: 1) l'attribut personnalisé ( app:showAsName) et toutes ses valeurs possibles sont inclus dans votre application lorsque vous incluez la appcompat-v7bibliothèque (qui la définit dans son attrs.xmlfichier). 2) La bibliothèque AppCompat (en particulier, ActionMenuView qui s'utilise automatiquement lorsque vous utilisez ActionBarActivity) analyse et utilise app:showAsActionpour afficher correctement les éléments de la même manière sur tous les niveaux d'API. Cela nécessite certainement à la fois XML et du code pour fonctionner ensemble.
ianhanniballake
0

Vous pouvez obtenir des explications à partir de ce lien

Espace de noms XML

Déclaration d'espace de noms Un espace de noms XML est déclaré à l'aide de l'attribut XML réservé xmlns ou xmlns: prefix, dont la valeur doit être un nom d'espace de noms valide.

Par exemple, la déclaration suivante mappe le préfixe "xhtml:" à l'espace de noms XHTML:

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

Tout élément ou attribut dont le nom commence par le préfixe "xhtml:" est considéré comme faisant partie de l'espace de noms XHTML, s'il ou un ancêtre possède la déclaration d'espace de noms ci-dessus.

Il est également possible de déclarer un espace de noms par défaut. Par exemple:

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

Dans ce cas, tout élément sans préfixe d'espace de noms est considéré comme étant dans l'espace de noms XHTML, si lui ou un ancêtre a la déclaration d'espace de noms par défaut ci-dessus.

S'il n'y a pas de déclaration d'espace de noms par défaut dans la portée, le nom de l'espace de noms n'a aucune valeur. [6] Dans ce cas, un élément sans préfixe d'espace de noms explicite est considéré comme n'appartenant à aucun espace de noms.

Les attributs ne sont jamais soumis à l'espace de noms par défaut. Un attribut sans préfixe d'espace de noms explicite est considéré comme n'appartenant à aucun espace de noms.

KIRPAL SINGH
la source