
Quando si lavora a file XML collocati tra le risorse del progetto, si nota subito che il nodo root è caratterizzato dalla presenza di uno o più namespace.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ... ... >
Questo termine – nell’ambito del formato XML in generale – rappresenta uno spazio dei nomi in cui sono definiti attributi e tag che possono essere utilizzati nel documento.
Nella dicitura sopra riportata si nota che al namespace http://schemas.android.com/apk/res/android è stato associato il nome android pertanto tutti gli attributi utilizzati a corredo dei tag dovranno avere tale prefisso: ad esempio, non chiederemo di usare l’attributo layout_width bensì android:layout_width. Ciò preserverà da eventuali ambiguità qualora in una propria libreria si definissero attributi XML personalizzati omonimi di quelli già presenti in Android.
Mentre il namespace android appena citato è riferito alla generalità della piattaforma, quando si integrano librerie esterne può essere necessario richiedere l’uso di ulteriori namespace che contemplino la definizione di attributi specifici.
Caso frequente, quando si integra la libreria appcompat (praticamente, sempre) per rendere disponibili funzionalità più nuove in versioni datate del sistema, è necessario aggiungere l’ulteriore namespace che, di norma, viene etichettato con il prefisso app:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" >
Un caso che in molti avranno notato, si verifica quando si prova ad utilizzare l’attributo showAsAction nella definizione di un item di una risorsa menu. Richiedendone l’impiego come elemento del namespace android, Android Studio ci segnalerà l’esistenza di una sua nuova versione nella libreria di supporto del quale è consigliabile l’utilizzo. Ciò perchè showAsAction è stato definito nelle API 11 mentre appcompat che lo ha ridefinito permette l’uso delle proprie funzionalità a ritroso fino alle API 7. Pertanto, è assolutamente da preferire l’uso dell’attributo nella versione della libreria di più ampia validità.
Altro namespace molto diffuso è tools, definito così:
<RelativeLayout ... ... xmlns:tools="http://schemas.android.com/tools">
Il namespace tools offre funzionalità utili durante il design o comportamenti specifici a tempo di compilazione. Non avendo alcun effetto sull’esecuzione dell’applicazione, le annotazioni ad esso relative verranno rimosse dai build-tools (cui abbiamo accennato in un post precedente) durante la fase di building non comportando pertanto un aumento delle dimensioni del prodotto finale.
Ad esempio:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" ... ... tools:context="it.devapp.myapplication.MainActivity">
l’attributo context indicherà a quale Activity il layout è destinato e ciò metterà l’editor – in fase di progettazione – in condizione di supportare il programmatore in una maniera possibile solo con la premessa di tale conoscenza. Un esempio piuttosto immediato di questo vantaggio è rappresentato dalla possibilità di suggerire quali metodi indicare per il completamento dell’attributo onClick di un pulsante: conoscendo l’Activity relativa sarà semplice per Android Studio fare una proposta o permettere di creare un metodo nuovo che abbia il nome uguale al valore assegnato all’attributo.
I namespace XML sono elementi così onnipresenti nelle risorse Android che il programmatore corre il rischio di abituarsi troppo alla loro vista e di trascurarne il senso. Invece essi costituiscono, come abbiamo visto, un elemento essenziale alla corretta progettazione delle risorse ed un loro utilizzo superficiale potrebbe indurre in errori.
Alla prossima!
No Responses to “Android, uno sguardo da vicino ai namespace XML”