Was ist der Android-XML-Namespace "App"?

164

Hier ist ein Beispiel für den appNamespace, den ich aus einer res/menu/main.xmlDatei gesehen habe

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

Welchen Zweck erfüllt der appNamespace? Ist es ein "Standard" Android XML Namespace? Sind dieselben Wertoptionen für dasselbe Attribut in zwei verschiedenen Namespaces (z . B. app:showAsActionund android:showAsAction) verfügbar?

Aus den Dokumenten : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

dh würde die Zeile im obigen Beispiel etwas anderes bedeuten, wenn das Attribut stattdessen wäre:

android:showAsAction="never"

Es sieht fast so aus, als wäre es eine Art "Unterklassen" -Mechanismus, aber ich kann anscheinend keine echte Dokumentation zum appNamespace aus Google / Android-Quellen finden.

coder123
quelle

Antworten:

213

Der appNamespace ist nicht spezifisch für eine Bibliothek, wird jedoch für alle in Ihrer App definierten Attribute verwendet, sei es durch Ihren Code oder durch von Ihnen importierte Bibliotheken, wodurch effektiv ein einziger globaler Namespace für benutzerdefinierte Attribute erstellt wird - dh Attribute, die nicht vom Android-System definiert wurden .

In diesem Fall verwendet die appcompat-v7Bibliothek benutzerdefinierte Attribute, die die android:Namespace- Attribute spiegeln , um android:showAsActionfrühere Versionen von Android zu unterstützen (zum Beispiel: wurde nur in API11 hinzugefügt, funktioniert aber app:showAsAction(als Teil Ihrer Anwendung bereitgestellt) auf allen API-Ebenen, die Ihre App ausführt - offensichtlich Die Verwendung von android:showAsActionwürde auf API-Ebenen, auf denen dieses Attribut nicht definiert ist, nicht funktionieren.

ianhanniballake
quelle
1
Danke dir! Ich bin froh, dass ich dies endlich in der Dokumentation erwähnt habe. Eine Folgefrage. In den Dokumenten der Aktionsleiste in Ihrem Link heißt es: "Beachten Sie, dass das obige Attribut showAsAction einen benutzerdefinierten Namespace verwendet, der im Tag <menu> definiert ist. Dies ist erforderlich, wenn Sie XML-Attribute verwenden, die von der Support-Bibliothek definiert wurden, da diese Attribute in der nicht vorhanden sind Android-Framework auf älteren Geräten. Sie müssen daher Ihren eigenen Namespace als Präfix für alle von der Support-Bibliothek definierten Attribute verwenden. "
coder123
1
Was passiert also auf älteren Geräten, auf denen die Attribute im Framework nicht vorhanden sind? Mir ist noch nicht klar, wie das Definieren eines benutzerdefinierten Namespace die fehlende Unterstützung für ein Attribut umgeht. Bedeutet das Deklarieren showAsActionunter einem benutzerdefinierten Namespace, dass es auf neueren Plattformen wie erwartet funktioniert und auf älteren Plattformen ignoriert wird?
coder123
4
Nicht vorhandene Attribute werden stillschweigend ignoriert. Wenn Sie ein benutzerdefiniertes Attribut erstellen, stellen Sie sicher, dass das benutzerdefinierte Attribut zur Laufzeit vorhanden ist (offensichtlich: seine Definition ist in Ihrer App enthalten). Daher verwendet die Unterstützungsbibliothek benutzerdefinierte Attribute, sodass der benutzerdefinierte Code zum Erstellen von Menüs einen einzigen Codepfad verwenden kann, der für alle API-Versionen funktioniert und im Wesentlichen die Notwendigkeit ersetzt, die android:Versionen zu verwenden.
Ianhanniballake
2
Es tut mir leid, wenn ich es nicht einfach nicht verstehe. Können Sie mir helfen zu verstehen, wie einfach das Ändern des Namespace eine Definition für ein Attribut liefert? Wenn das showAsNameAttribut in einer älteren Bibliothek nicht unterstützt wird, wie ein benutzerdefinierter nicht mit der die Plattform Namespace zu ermöglichen , den Bereich möglichen Wert Möglichkeiten zu kennen ( ifRoom, neverusw.), und weiß , wie diese Optionen zu interpretieren? Ich gehe davon aus, dass "Attribute, die nicht existieren" Attribute bedeutet, für die es keine Implementierung in der Bibliothek gibt. Swapping android:für app:scheint kaum eine vollständige Abhilfe. Vermisse ich etwas
coder123
14
Es besteht aus zwei Teilen: 1) Das benutzerdefinierte Attribut ( app:showAsName) und alle möglichen Werte werden in Ihre App aufgenommen, wenn Sie die appcompat-v7Bibliothek einschließen (die sie in ihrer attrs.xmlDatei definiert). 2) Die AppCompat-Bibliothek (insbesondere ActionMenuView, die bei Verwendung automatisch verwendet wird ActionBarActivity) analysiert und verwendet die app:showAsAction, um Elemente auf allen API-Ebenen auf dieselbe Weise ordnungsgemäß anzuzeigen . Es erfordert sicherlich sowohl XML als auch Code, um zusammenzuarbeiten.
Ianhanniballake
0

Unter diesem Link erhalten Sie eine Erklärung

XML-Namespace

Namespace-Deklaration Ein XML-Namespace wird mit dem reservierten XML-Attribut xmlns oder xmlns: prefix deklariert, dessen Wert ein gültiger Namespace-Name sein muss.

In der folgenden Deklaration wird beispielsweise das Präfix "xhtml:" dem XHTML-Namespace zugeordnet:

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

Jedes Element oder Attribut, dessen Name mit dem Präfix "xhtml:" beginnt, wird als im XHTML-Namespace befindlich betrachtet, wenn es oder ein Vorfahr die obige Namespace-Deklaration hat.

Es ist auch möglich, einen Standard-Namespace zu deklarieren. Beispielsweise:

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

In diesem Fall wird jedes Element ohne Namespace-Präfix als im XHTML-Namespace befindlich betrachtet, wenn es oder ein Vorfahr die oben genannte Standard-Namespace-Deklaration hat.

Wenn es keine Standard-Namespace-Deklaration im Gültigkeitsbereich gibt, hat der Namespace-Name keinen Wert. [6] In diesem Fall wird davon ausgegangen, dass sich ein Element ohne explizites Namespace-Präfix in keinem Namespace befindet.

Attribute unterliegen niemals dem Standard-Namespace. Ein Attribut ohne explizites Namespace-Präfix befindet sich in keinem Namespace.

KIRPAL SINGH
quelle