Qual è lo spazio dei nomi XML Android 'app'?


164

Ecco un esempio dello appspazio dei nomi che ho visto da un res/menu/main.xmlfile

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

A quale scopo serve lo appspazio dei nomi? È uno spazio dei nomi XML "standard" per Android? Sono disponibili le stesse opzioni di valore per lo stesso attributo collocate in due spazi dei nomi diversi (ad es. app:showAsActionE android:showAsAction).

Dai documenti : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

cioè, la riga nell'esempio sopra significherebbe qualcos'altro se l'attributo fosse invece:

android:showAsAction="never"

Sembra quasi che potrebbe essere una sorta di meccanismo di "sottoclasse", ma non riesco a trovare alcuna vera documentazione sullo appspazio dei nomi da fonti Google / Android.

Risposte:


213

Lo appspazio dei nomi non è specifico di una libreria, ma viene utilizzato per tutti gli attributi definiti nella tua app, sia per il codice che per le librerie importate, creando in modo efficace un unico spazio dei nomi globale per gli attributi personalizzati, ovvero attributi non definiti dal sistema Android .

In questo caso, la appcompat-v7libreria utilizza attributi personalizzati che rispecchiano android:quelli dello spazio dei nomi per supportare le versioni precedenti di Android (ad esempio: è android:showAsActionstato aggiunto solo in API11, ma app:showAsAction(essendo fornito come parte dell'applicazione) funziona su tutti i livelli API della tua app) - ovviamente l'utilizzo di android:showAsActionnon funzionerebbe a livello di API in cui tale attributo non è definito.


1
Grazie! Sono felice di aver finalmente trovato una menzione di questo nella documentazione. Una domanda di follow-up, però. I documenti della barra delle azioni nel collegamento indicano: "Si noti che l'attributo showAsAction sopra utilizza uno spazio dei nomi personalizzato definito nel tag <menu>. Ciò è necessario quando si utilizzano gli attributi XML definiti dalla libreria di supporto, poiché questi attributi non esistono nel Framework Android su dispositivi meno recenti. Pertanto, è necessario utilizzare il proprio spazio dei nomi come prefisso per tutti gli attributi definiti dalla libreria di supporto. "
coder123,

1
Quindi cosa succede sui dispositivi più vecchi in cui gli attributi non esistono nel framework? Non mi è ancora chiaro come la definizione di uno spazio dei nomi personalizzato funzioni attorno al supporto mancante per un attributo. Dichiarare showAsActionin uno spazio dei nomi personalizzato significa che funziona come previsto sulle piattaforme più recenti e viene ignorato su quelle più vecchie?
coder123,

4
Gli attributi che non esistono vengono silenziosamente ignorati. Quando crei un attributo personalizzato, stai garantendo che l'attributo personalizzato esisterà in fase di esecuzione (ovviamente: la sua definizione è inclusa nella tua app). Pertanto, la libreria di supporto utilizza attributi personalizzati in modo che il loro codice personalizzato per la creazione di menu possa utilizzare un singolo percorso di codice che funzioni su tutte le versioni dell'API, sostituendo sostanzialmente qualsiasi necessità di utilizzare le android:versioni.
ianhanniballake,

2
Mi dispiace se non lo capisco. Potete aiutarmi a capire come la semplice modifica dello spazio dei nomi fornisce una definizione per un attributo? Se l' showAsNameattributo non è supportato in una vecchia libreria, come si fa con un custom namespace permettere alla piattaforma di conoscere la gamma di opzioni possibili valori ( ifRoom, never, ecc), e saper interpretare queste opzioni? Suppongo che "attributi che non esistono" significa attributi per i quali non esiste un'implementazione nella libreria. Lo scambio android:con app:difficilmente sembra una soluzione completa. Mi sto perdendo qualcosa?
coder123,

14
Ci sono due parti: 1) l'attributo personalizzato ( app:showAsName) e tutti i suoi possibili valori sono inclusi nella tua app quando includi la appcompat-v7libreria (che la definisce nel suo attrs.xmlfile). 2) La libreria AppCompat (in particolare, ActionMenuView che viene utilizzata automaticamente quando si utilizza ActionBarActivity) analizza e utilizza il app:showAsActionper mostrare correttamente gli elementi allo stesso modo su tutti i livelli API. Certamente richiede sia XML che codice per lavorare insieme.
ianhanniballake,

0

Puoi ottenere qualche spiegazione da questo link

Spazio dei nomi XML

Dichiarazione dello spazio dei nomi Uno spazio dei nomi XML viene dichiarato utilizzando l'attributo XML riservato xmlns o xmlns: prefisso, il cui valore deve essere un nome dello spazio dei nomi valido.

Ad esempio, la seguente dichiarazione associa il prefisso "xhtml:" allo spazio dei nomi XHTML:

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

Qualsiasi elemento o attributo il cui nome inizia con il prefisso "xhtml:" viene considerato nello spazio dei nomi XHTML, se esso o un antenato hanno la dichiarazione dello spazio dei nomi sopra.

È anche possibile dichiarare uno spazio dei nomi predefinito. Per esempio:

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

In questo caso, qualsiasi elemento senza prefisso dello spazio dei nomi viene considerato nello spazio dei nomi XHTML, se esso o un antenato hanno la dichiarazione dello spazio dei nomi predefinita sopra.

Se non esiste una dichiarazione dello spazio dei nomi predefinita nell'ambito, il nome dello spazio dei nomi non ha valore. [6] In tal caso, un elemento senza un prefisso dello spazio dei nomi esplicito viene considerato come non presente in nessuno spazio dei nomi.

Gli attributi non sono mai soggetti allo spazio dei nomi predefinito. Un attributo senza un prefisso dello spazio dei nomi esplicito è considerato non presente in nessuno spazio dei nomi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.