{"id":12789,"date":"2017-12-29T11:50:10","date_gmt":"2017-12-29T10:50:10","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12789"},"modified":"2017-12-29T11:50:10","modified_gmt":"2017-12-29T10:50:10","slug":"android-uno-sguardo-da-vicino-ai-namespace-xml","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/android-uno-sguardo-da-vicino-ai-namespace-xml\/","title":{"rendered":"Android, uno sguardo da vicino ai namespace XML"},"content":{"rendered":"<p>Quando si lavora a file XML collocati tra le risorse del progetto, si nota subito che il <strong>nodo <em>root<\/em><\/strong> \u00e8 caratterizzato dalla <strong>presenza di uno o pi\u00f9 namespace<\/strong>.<\/p>\n<pre class=\"lang:java decode:true\">&lt;LinearLayout \r\n   xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n   ... \r\n   ...\r\n &gt;<\/pre>\n<p>Questo termine &#8211; nell&#8217;ambito del formato XML in generale &#8211; rappresenta uno spazio dei nomi in cui sono definiti attributi e tag che possono essere utilizzati nel documento.<\/p>\n<p>Nella dicitura sopra riportata si nota che al namespace <em>http:\/\/schemas.android.com\/apk\/res\/android<\/em>\u00a0\u00e8 stato associato il nome <em>android<\/em> pertanto tutti gli attributi utilizzati a corredo dei tag dovranno avere tale prefisso: ad esempio, non chiederemo di usare l&#8217;attributo<em> layout_width<\/em> bens\u00ec <em>android:layout_width<\/em>. Ci\u00f2 preserver\u00e0 da eventuali ambiguit\u00e0 qualora in una propria libreria si definissero attributi XML personalizzati omonimi di quelli gi\u00e0 presenti in Android.<br \/>\nMentre il namespace <em>android<\/em> appena citato \u00e8 riferito alla generalit\u00e0 della piattaforma, quando si integrano librerie esterne pu\u00f2 essere necessario richiedere l&#8217;uso di ulteriori namespace\u00a0che contemplino la definizione di attributi specifici.<br \/>\nCaso frequente, <strong>quando si integra la libreria <em>appcompat<\/em><\/strong> (praticamente, sempre) per rendere disponibili funzionalit\u00e0 pi\u00f9 nuove in versioni datate del sistema, \u00e8 necessario aggiungere l&#8217;ulteriore namespace che, di norma, viene etichettato con il <strong>prefisso app<\/strong>:<\/p>\n<pre class=\"lang:java decode:true \">&lt;menu \r\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\" &gt;<\/pre>\n<p>Un caso che in molti avranno notato, si verifica quando si prova ad utilizzare l&#8217;attributo <em>showAsAction<\/em> nella definizione di un item di una risorsa menu. Richiedendone l&#8217;impiego come elemento del namespace <em>android<\/em>, Android Studio ci segnaler\u00e0 l&#8217;esistenza di una sua nuova versione nella libreria di supporto del quale \u00e8\u00a0consigliabile l&#8217;utilizzo. Ci\u00f2 perch\u00e8 showAsAction \u00e8 stato definito nelle API 11 mentre appcompat che lo ha ridefinito permette l&#8217;uso delle proprie funzionalit\u00e0 a ritroso fino alle API 7. Pertanto, \u00e8 assolutamente da preferire l&#8217;uso dell&#8217;attributo nella versione della libreria di pi\u00f9 ampia validit\u00e0.<br \/>\nAltro namespace molto diffuso \u00e8 <strong>tools<\/strong>, definito cos\u00ec:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;RelativeLayout\r\n   ...\r\n   ...\r\n   xmlns:tools=\"http:\/\/schemas.android.com\/tools\"&gt;<\/pre>\n<p>Il <strong>namespace tools offre funzionalit\u00e0 utili durante il design o comportamenti specifici a tempo di compilazione<\/strong>. Non avendo alcun effetto sull&#8217;esecuzione dell&#8217;applicazione, le annotazioni ad esso relative verranno rimosse dai <em>build-tools<\/em>\u00a0(cui abbiamo accennato in un post precedente) durante la fase di <em>building<\/em>\u00a0non comportando pertanto un aumento delle dimensioni del prodotto finale.<br \/>\nAd esempio:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;RelativeLayout \r\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n    ...\r\n    ...\r\n    tools:context=\"it.devapp.myapplication.MainActivity\"&gt;<\/pre>\n<p>l&#8217;attributo <em>context<\/em> indicher\u00e0 a quale Activity il layout \u00e8 destinato e ci\u00f2 metter\u00e0 l&#8217;editor &#8211; in fase di progettazione &#8211; in condizione di supportare il programmatore in una maniera possibile solo\u00a0con la premessa di tale conoscenza. Un esempio piuttosto immediato di questo vantaggio \u00e8 rappresentato dalla possibilit\u00e0 di suggerire quali metodi indicare per il completamento dell&#8217;attributo <em>onClick<\/em> di un pulsante: conoscendo l&#8217;Activity relativa sar\u00e0 semplice per Android Studio fare una proposta\u00a0o permettere di creare un metodo nuovo che abbia il nome uguale al valore assegnato all&#8217;attributo.<\/p>\n<p>I namespace XML sono elementi cos\u00ec onnipresenti nelle risorse Android che il programmatore corre il rischio di abituarsi\u00a0troppo 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\u00a0potrebbe indurre in errori.<\/p>\n<p>Alla prossima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si lavora a file XML collocati tra le risorse del progetto, si nota subito che il&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13354,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1682],"tags":[1278,1541,1737,1564,1872,1873,1874],"class_list":["post-12789","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","tag-android","tag-android-studio","tag-creare-app-mobile","tag-mobile","tag-risorse-android","tag-xml","tag-xml-namespace"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=12789"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12789\/revisions"}],"predecessor-version":[{"id":13353,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12789\/revisions\/13353"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13354"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}