130

Ecco un esempio dello spazio dei nomi app che ho visto da un file di res/menu/main.xmlChe cos'è lo spazio dei nomi XML Android dell'app?

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

cosa serve lo spazio dei nomi app servire? Si tratta di uno spazio dei nomi XML "standard"? Sono disponibili le stesse opzioni di valore per lo stesso attributo collocati in due diversi spazi dei nomi (ad esempio app:showAsAction e android:showAsAction).

Dal docs: android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

cioè, sarebbe la linea nell'esempio di cui sopra significa qualcosa di diverso se l'attributo fosse invece:

android:showAsAction="never" 

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

risposta

164

Lo spazio dei nomi app non è specifico di una libreria, ma viene utilizzato per tutti gli attributi definiti nell'app, dal codice o dalle librerie importate, creando effettivamente un singolo spazio dei nomi globale per gli attributi personalizzati, ovvero non attributi definito dal sistema Android.

In questo caso, la libreria appcompat-v7 utilizza attributi personalizzati mirroring dei android: quelli dello spazio dei nomi per supportare le versioni precedenti di Android (per esempio: android:showAsAction è stato aggiunto solo in API11, ma app:showAsAction (essere fornito come parte della vostra applicazione) funziona su tutte le Livelli API della tua app): ovviamente l'utilizzo di android:showAsAction non funzionerebbe con livelli 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ò. La barra delle azioni doc nel tuo collegamento dice: "Si noti che l'attributo showAsAction in alto utilizza uno spazio dei nomi personalizzato definito nel tag

. Ciò è necessario quando si utilizzano gli attributi XML definiti dalla libreria di supporto, poiché questi attributi non esistono nel framework Android su dispositivi precedenti, quindi è 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 'showAsAction' sotto un namespace personalizzato significa che funziona come previsto sulle piattaforme più recenti e viene ignorato su quelli più vecchi? – coder123

+3

Gli attributi che non esistono vengono ignorati silenziosamente. 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 API, sostituendo sostanzialmente qualsiasi necessità di utilizzare le versioni 'android:'. – ianhanniballake

Problemi correlati