<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
	<title>Daniele Serio - Official Web Site - @2011</title>
	
	<link>http://www.danieleserio.it</link>
	<description>...programmare è uno stile di vita...</description>
	<lastBuildDate>Fri, 18 May 2012 08:19:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/danieleserio/LnTo" /><feedburner:info uri="danieleserio/lnto" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Applicazione Android per visualizzare il credito telefonico WIND!</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/IAAZyi0aftA/</link>
		<comments>http://www.danieleserio.it/applicazione-android-per-visualizzare-il-credito-telefonico-wind/#comments</comments>
		<pubDate>Fri, 18 May 2012 07:18:10 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[I miei Software]]></category>
		<category><![CDATA[Lavori]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2916</guid>
		<description><![CDATA[Applicazione che permette di visualizzare il proprio credito telefonico WIND senza dover digitare il codice sulla tastiera del telefono e [...]]]></description>
			<content:encoded><![CDATA[<p>Applicazione che permette di visualizzare il proprio credito telefonico WIND senza dover digitare il codice sulla tastiera del telefono e senza SMS, direttamente sullo schermo del vostro telefono. Esiste la versione Widget da me creata e si chiama &#8220;Credito Wind&#8221;.</p>
<table class="aligncenter" border="0" cellspacing="20" cellpadding="20">
<tbody>
<tr>
<td><a href="http://www.danieleserio.it/wp-content/uploads/2012/05/PQAAAE82ZwdZrHNIt14xA-Xu_de8gomMxgmpT4Ep8aOB7vGBFNcnxa9nuyeF7nExdOQRoLJvcz-1S-o_4E_upyZ5pVUAzfqVaSXX9wXu0NfqizVKFkTi0Vk5umWl.jpg"><img class="aligncenter  wp-image-2917" title="PQAAAE82ZwdZrHNIt14xA-Xu_de8gomMxgmpT4Ep8aOB7vGBFNcnxa9nuyeF7nExdOQRoLJvcz-1S-o_4E_upyZ5pVUAzfqVaSXX9wXu0NfqizVKFkTi0Vk5umWl" src="http://www.danieleserio.it/wp-content/uploads/2012/05/PQAAAE82ZwdZrHNIt14xA-Xu_de8gomMxgmpT4Ep8aOB7vGBFNcnxa9nuyeF7nExdOQRoLJvcz-1S-o_4E_upyZ5pVUAzfqVaSXX9wXu0NfqizVKFkTi0Vk5umWl.jpg" alt="" width="288" height="480" /></a></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><span style="font-size: large;"><strong>Scaricala da Google Play o direttamente dal tuo cellulare nel Google Store!!!!</strong></span></p>
<p style="text-align: center;"><a href="https://play.google.com/store/apps/details?id=it.danieleserio.wind_pay&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpby53aW5kX3BheSJd">https://play.google.com/store/apps/details?id=it.danieleserio.wind_pay&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpby53aW5kX3BheSJd</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/bmjAT6K_3aJ4qidLvvZbiLglyPA/0/da"><img src="http://feedads.g.doubleclick.net/~a/bmjAT6K_3aJ4qidLvvZbiLglyPA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bmjAT6K_3aJ4qidLvvZbiLglyPA/1/da"><img src="http://feedads.g.doubleclick.net/~a/bmjAT6K_3aJ4qidLvvZbiLglyPA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/IAAZyi0aftA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/applicazione-android-per-visualizzare-il-credito-telefonico-wind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/applicazione-android-per-visualizzare-il-credito-telefonico-wind/</feedburner:origLink></item>
		<item>
		<title>Disponibile la versione Widget di MobySwitch</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/GoLv_CBKOfM/</link>
		<comments>http://www.danieleserio.it/disponibile-la-versione-widget-di-mobyswitch/#comments</comments>
		<pubDate>Mon, 14 May 2012 09:45:34 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[I miei Software]]></category>
		<category><![CDATA[Lavori]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2907</guid>
		<description><![CDATA[Da oggi è disponibile su Google Play il widget di MobySwitch. Permette di attivare e disattivara la Connessione Dati internet [...]]]></description>
			<content:encoded><![CDATA[<p>Da oggi è disponibile su Google Play il widget di MobySwitch.</p>
<p>Permette di attivare e disattivara la Connessione Dati internet con un tocco senza accedere al menù Impostazioni. Semplice e veloce.</p>
<p>Aggiungilo alla schermata home per averlo sempre a disposizione.</p>
<p>&nbsp;</p>
<p style="text-align: center;"> [get_google_lead_90]</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="https://play.google.com/store/apps/details?id=it.danieleserio.mobyswitchwidget&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpby5tb2J5c3dpdGNod2lkZ2V0Il0.">https://play.google.com/store/apps/details?id=it.danieleserio.mobyswitchwidget&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpby5tb2J5c3dpdGNod2lkZ2V0Il0.</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/rIvDLSG0CEDpr_3CVoFGcw-WMoc/0/da"><img src="http://feedads.g.doubleclick.net/~a/rIvDLSG0CEDpr_3CVoFGcw-WMoc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rIvDLSG0CEDpr_3CVoFGcw-WMoc/1/da"><img src="http://feedads.g.doubleclick.net/~a/rIvDLSG0CEDpr_3CVoFGcw-WMoc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/GoLv_CBKOfM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/disponibile-la-versione-widget-di-mobyswitch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/disponibile-la-versione-widget-di-mobyswitch/</feedburner:origLink></item>
		<item>
		<title>Disponibile per il download: GWT Developer Plugin per Firefox 12.0</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/OitDlesBAkU/</link>
		<comments>http://www.danieleserio.it/disponibile-per-il-download-gwt-developer-plugin-per-firefox-12-0/#comments</comments>
		<pubDate>Tue, 08 May 2012 08:27:30 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[GWT - Google Web Toolkit]]></category>
		<category><![CDATA[Programmazione]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2894</guid>
		<description><![CDATA[E&#8217; uscito Firefox 12, e molti sviluppatori GWT &#8211; SMARTGWT &#8211; EXTJS &#8211; GXT sui sono trovati di fronte ad un [...]]]></description>
			<content:encoded><![CDATA[<div>E&#8217; uscito <strong>Firefox 12</strong>, e molti sviluppatori GWT &#8211; SMARTGWT &#8211; EXTJS &#8211; GXT sui sono trovati di fronte ad un problema: il plugin gwt-developer-mode non è compatibile.</div>
<p>Ho avuto la necessità di sviluppare su Firefox 12, e quindi dopo qualche ora di lavoro, ecco qui pronto &#8220;<strong>GWT Developer Plugin per Firefox 12&#8243;</strong>.<img title="Continua..." src="http://www.danieleserio.it/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p><img title="Continua..." src="http://www.danieleserio.it/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p style="text-align: center;">[get_google_lead_90]</p>
<p>Il plugin è testato e funzionante su tutte le piattaforme e sistemi operativi sia a 32bit che a 64bit. </p>
<p><img title="Continua..." src="http://www.danieleserio.it/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<table border="0">
<tbody>
<tr>
<td>
<p>Ecco il link per il download: [get_link_pwd]</p>
<p>Hello, I just finished creating GWT Developer Plugin for Firefox 12.</p>
<p>The plugin is tested and running on all platforms.</p>
<p>Here is the link for download:  [get_link_pwd]</p>
</td>
<td>[get_juice_box]</td>
</tr>
</tbody>
</table>

<p><a href="http://feedads.g.doubleclick.net/~a/Ycy9w7TotwjDE-iUUaqg_zMW0E8/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ycy9w7TotwjDE-iUUaqg_zMW0E8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ycy9w7TotwjDE-iUUaqg_zMW0E8/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ycy9w7TotwjDE-iUUaqg_zMW0E8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/OitDlesBAkU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/disponibile-per-il-download-gwt-developer-plugin-per-firefox-12-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/disponibile-per-il-download-gwt-developer-plugin-per-firefox-12-0/</feedburner:origLink></item>
		<item>
		<title>Widget Android per visualizzare il credito telefonico WIND!</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/z7akjywh4AI/</link>
		<comments>http://www.danieleserio.it/widget-android-per-visualizzare-il-credito-telefonico-wind/#comments</comments>
		<pubDate>Sat, 05 May 2012 13:45:12 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[I miei Software]]></category>
		<category><![CDATA[Lavori]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2883</guid>
		<description><![CDATA[AGGIORNAMENTO:  Dal 6/05/2012 raggiunti i 328 download. Grazie a tutti &#160; Pronta una nuova applicazione Android molto utile! E&#8217; un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong><span style="text-decoration: underline;"><a href="http://www.danieleserio.it/wp-content/uploads/2012/05/qr_CreditoWind.png"><br /></a>AGGIORNAMENTO:</span>  Dal 6/05/2012 raggiunti i 328 download. Grazie a tutti</strong></p>
<p>&nbsp;</p>
<p>Pronta una nuova applicazione Android molto utile! E&#8217; un widget che si può aggiungere alla schermata Home del proprio Smartphone che permette di visualizzare con un tocco il credito telefonico del vostro operatore WIND!</p>
<p>Da oggi non avrete più bisogno di digitare il numero *123# sulla tastiera del telefono, basta cliccare sull&#8217;icona dell&#8217;applicazione!!<span id="more-2883"></span></p>
<p style="text-align: center;"><strong><span style="font-size: medium;"> Ecco il link per poter scaricare l&#8217;app dal google play &#8220;Credito Wind&#8221;:</span></strong></p>
<p style="text-align: center;"><strong><span style="font-size: medium;"><a href="https://play.google.com/store/apps/details?id=it.danieleserio&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpbyJd">https://play.google.com/store/apps/details?id=it.danieleserio&amp;feature=search_result#?t=W251bGwsMSwxLDEsIml0LmRhbmllbGVzZXJpbyJd</a></span></strong></p>
<p style="text-align: center;">[get_google_lead_90]</p>
<p style="text-align: center;"><strong><a href="http://www.danieleserio.it/wp-content/uploads/2012/05/qr_CreditoWind.png"><img title="qr_CreditoWind" src="http://www.danieleserio.it/wp-content/uploads/2012/05/qr_CreditoWind.png" alt="" width="275" height="275" /></a></strong></p>
<table border="0" cellspacing="20" cellpadding="20">
<tbody>
<tr>
<td><a href="http://www.danieleserio.it/wp-content/uploads/2012/05/SC20120505-153628.png"><img class="aligncenter  wp-image-2884" title="SC20120505-153628" src="http://www.danieleserio.it/wp-content/uploads/2012/05/SC20120505-153628.png" alt="" width="269" height="448" /></a></td>
<td><a href="http://www.danieleserio.it/wp-content/uploads/2012/05/SC20120505-153632.png"><img class="aligncenter  wp-image-2885" title="SC20120505-153632" src="http://www.danieleserio.it/wp-content/uploads/2012/05/SC20120505-153632.png" alt="" width="269" height="448" /></a></td>
</tr>
</tbody>
</table>

<p><a href="http://feedads.g.doubleclick.net/~a/vmipGRuS517MxTDqvdb2pxntN2c/0/da"><img src="http://feedads.g.doubleclick.net/~a/vmipGRuS517MxTDqvdb2pxntN2c/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vmipGRuS517MxTDqvdb2pxntN2c/1/da"><img src="http://feedads.g.doubleclick.net/~a/vmipGRuS517MxTDqvdb2pxntN2c/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/z7akjywh4AI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/widget-android-per-visualizzare-il-credito-telefonico-wind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/widget-android-per-visualizzare-il-credito-telefonico-wind/</feedburner:origLink></item>
		<item>
		<title>Tema per WordPress – BOLDY</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/S7mBOBXI5kA/</link>
		<comments>http://www.danieleserio.it/tema-per-wordpress-boldy/#comments</comments>
		<pubDate>Thu, 03 May 2012 09:20:46 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2870</guid>
		<description><![CDATA[Vi presento oggi un nuovo tema per wordpress davvero bello e completo, si chiama BOLDY: DEMO: http://wordpress.site5.net/boldy/   DOWNLOAD: http://www.danieleserio.it/wp-content/uploads/sorgenti/boldy.zip [...]]]></description>
			<content:encoded><![CDATA[<p>Vi presento oggi un nuovo tema per wordpress davvero bello e completo, si chiama BOLDY:<span id="more-2870"></span></p>
<p style="text-align: center;"><a href="http://wordpress.site5.net/boldy/"><img src="http://www.juliusdesign.net/wp-content/uploads/2010/11/wordpress-template-gratis-8.jpg" alt="" width="306" height="411" /></a></p>
<p style="text-align: right;">DEMO:</p>
<p><a href="http://wordpress.site5.net/boldy/">http://wordpress.site5.net/boldy/</a></p>
<p> [get_google_lead_90]</p>
<p>DOWNLOAD:</p>
<p><a href="http://www.danieleserio.it/wp-content/uploads/sorgenti/boldy.zip">http://www.danieleserio.it/wp-content/uploads/sorgenti/boldy.zip</a></p>
<p>&nbsp;</p>

<p><a href="http://feedads.g.doubleclick.net/~a/2_Chv7Zv7M09ijqqhFmpfsbIqE8/0/da"><img src="http://feedads.g.doubleclick.net/~a/2_Chv7Zv7M09ijqqhFmpfsbIqE8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2_Chv7Zv7M09ijqqhFmpfsbIqE8/1/da"><img src="http://feedads.g.doubleclick.net/~a/2_Chv7Zv7M09ijqqhFmpfsbIqE8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/S7mBOBXI5kA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/tema-per-wordpress-boldy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/tema-per-wordpress-boldy/</feedburner:origLink></item>
		<item>
		<title>Guida base per programmare Android con Java</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/lTSQQd1-Tuk/</link>
		<comments>http://www.danieleserio.it/guida-base-per-programmare-android-con-java/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 11:42:52 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[adsense]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[daniele serio]]></category>
		<category><![CDATA[development mode]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programmare android]]></category>
		<category><![CDATA[programmazione]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2856</guid>
		<description><![CDATA[Avete acquistato un nuovo cellulare android e siete pronti a conoscere il funzionamento di questo fantastico sistema operativo mobile? Come con qualsiasi [...]]]></description>
			<content:encoded><![CDATA[<p>Avete acquistato un nuovo <strong>cellulare android</strong> e siete pronti a conoscere il funzionamento di questo fantastico sistema operativo mobile? Come con qualsiasi nuovo gadget tecnologico sicuramente avrete <strong>tante domande a cui cercate risposte</strong> sia in merito alle <strong>caratteristiche di Android</strong> e sia in merito al potente dispositivo che sicuramente avete già avviato. Ci sono tanti <strong>consigli, trucchi e tutorial</strong> fondamentali da scoprire. Andiamo adesso a vedere quali sono le informazioni indispensabili da conoscere che vi metteranno sulla strada giusta e vi aiuteranno a diventare <strong>esperti Android</strong>!<span id="more-2856"></span></p>
<p>Ecco a voi una breve <strong>guida per la programmazione di Android</strong> che ho scritto in questo periodo. La guida ha lo scopo di mostrare i concetti principali e le basi per avvicinarsi al mondo android e per scrivere la vostra prima app.</p>
<p style="text-align: center;">[get_google_lead_90]</p>
<p style="text-align: center;"><span style="font-size: large;"><strong>La guida è scaricabile a questo indirizzo in formato PDF:</strong></span></p>
<table class="aligncenter" border="0">
<tbody>
<tr>
<td>
<p>Ecco il link per il download: [get_link_pwd]</p>
</td>
<td>[get_juice_box]</td>
</tr>
</tbody>
</table>

<p><a href="http://feedads.g.doubleclick.net/~a/5xbUb4UAAu7gSgvvF58Tlu_7Q2M/0/da"><img src="http://feedads.g.doubleclick.net/~a/5xbUb4UAAu7gSgvvF58Tlu_7Q2M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5xbUb4UAAu7gSgvvF58Tlu_7Q2M/1/da"><img src="http://feedads.g.doubleclick.net/~a/5xbUb4UAAu7gSgvvF58Tlu_7Q2M/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/lTSQQd1-Tuk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/guida-base-per-programmare-android-con-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/guida-base-per-programmare-android-con-java/</feedburner:origLink></item>
		<item>
		<title>Data Storage: Shared Preferences</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/G6dozdfCnFk/</link>
		<comments>http://www.danieleserio.it/data-storage-shared-preferences/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 11:15:25 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2854</guid>
		<description><![CDATA[Ultima metodologia utilizzabile per il salvataggio permanente dei dati che andremo a presentare in questa guida sono le Shared Prefereces. Particolarità [...]]]></description>
			<content:encoded><![CDATA[<p>Ultima metodologia utilizzabile per il salvataggio permanente dei dati che andremo a presentare in questa guida sono le <strong>Shared Prefereces</strong>. Particolarità di questa metodologia è quella di possedere una <strong>struttura chiave/valore</strong> semplicissima da utilizzare.</p>
<p>Per fare un esempio sarà possibile settare una stringa <em>mioNome</em> per la chiave <em>Nome</em>. In un secondo momento, sarà possibile recuperare il valore associato alla chiave <em>Nome </em>semplicemente cercandola all&#8217;interno delle <em>Shared Preferences</em>.<span id="more-2854"></span></p>
<p>Questo tipo di metodologia di immagazzinamento dei dati in maniera permanente, risulta una via di mezzo tra i semplici file di testo e i più complessi database. La considerazione fatta per quanto riguarda la dimensione del set di dati da trattare è identica a quella fatta per i file di testo: anche in questo caso, nel caso in cui ci trovassimo a dover maneggiare set di dati molto grandi, le Shared Preferences non risultano essere la scelta migliore.</p>
<p>Un esempio tipico che ne viene fatto all&#8217;interno delle applicazioni è il salvataggio di preferenze da parte dell&#8217;utente come, per esempio, la lingua utilizzato oppure le preferenze relative all&#8217;audio.</p>
<p>Mostriamo adesso un esempio di utilizzo delle Shared Preferences in una applicazione di esempio. Nel nostro codice andremo a modificare il contenuto di una TextView a seconda che sia stato salvato o meno un certo dato. Il codice di esempio è il seguente:</p>
<p><strong>import android.widget.*;</strong></p>
<p><strong>import android.content.*;</strong></p>
<p><strong> </strong></p>
<p><strong>public class provaSharedPreferences extends Activity {</strong><strong>            </strong></p>
<p><strong>  private LinearLayout layout;</strong></p>
<p><strong>  private TextView tv;</strong></p>
<p><strong>  </strong></p>
<p><strong>  /** Called when the activity is first created. */</strong></p>
<p><strong>  @Override</strong></p>
<p><strong>  </strong></p>
<p><strong>  public void onCreate(Bundle savedInstanceState) {</strong><strong>    super.onCreate(savedInstanceState);</strong><strong>   </strong></p>
<p><strong>    Button bottone = new Button(this);  </strong></p>
<p><strong>    layout = new LinearLayout(this); </strong></p>
<p><strong>    layout.addView(bottone);</strong></p>
<p><strong>    layout.addView(tv);</strong></p>
<p><strong>    setContentView(layout);</strong></p>
<p><strong>    </strong></p>
<p><strong>    SharedPreferences settings = getSharedPreferences(&#8220;PROVA&#8221;, 0);</strong></p>
<p><strong>    String nome = settings.getString(&#8220;nome&#8221;, &#8220;Nessun valore inserito&#8221;);</strong></p>
<p><strong>    tv.setText(&#8220;risultato:&#8221;+ nome);</strong></p>
<p><strong> </strong></p>
<p><strong>    bottone.setOnClickListener(new View.OnClickListener() {</strong></p>
<p><strong>            </strong></p>
<p><strong>      public void onClick(View view) { </strong></p>
<p><strong>        SharedPreferences settings = getSharedPreferences(&#8220;PROVA&#8221;, 0);</strong></p>
<p><strong>        SharedPreferences.Editor editor = settings.edit();</strong></p>
<p><strong>        editor.putString(&#8220;nome&#8221;,&#8221;Matteo&#8221; );</strong></p>
<p><strong> </strong></p>
<p><strong>        editor.commit();</strong></p>
<p><strong>        String nome = settings.getString(&#8220;nome&#8221;, &#8220;Nessun valore inserito&#8221;);</strong></p>
<p><strong>        tv.setText(&#8220;risultato:&#8221;+ nome);</strong></p>
<p><strong>      }</strong></p>
<p><strong>    });</strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Andiamo adesso ad effettuare la consueta analisi del codice. Dopo aver dichiarato e creato widget e layout, vediamo che viene dichiarato un oggetto di tipo SharedPreferences che viene inizializzato utilizzano il metodo getSharedPreferences. Quest&#8217;ultimo ritorna la Shared Preference indicata come primo parametro se quest&#8217;ultima esiste, altrimenti la crea e ritorna proprio questa shared perference appena creata.</p>
<p>In seguito andiamo a recuperare il valore associato alla chiave nome utilizzando il metodo getString. Quest&#8217;ultimo ritorna il valore associato alla chiave indicata come primo parametro se la chiave esiste, in caso contrario ritorna il valore passatogli come secondo parametro.</p>
<p>All&#8217;interno del listener associato al bottone andiamo nuovamente a recuperare l&#8217;istanza delle Shared Preferences voluta ed andiamo a creare un oggetto di tipo editor necessario per poter modificare i valori all&#8217;interno della Shared Preference per il quale è stato creato (ciò avviene con settings.edit()).</p>
<p>L&#8217;aggiornamento del valore per la chiave nome viene eseguita invocando il metodo putString sull&#8217;oggetto editor precedentemente creato. Come ultima cosa si rendono permanenti le modifiche appena apportate invocando il metodo commit e poi andiamo ad inserire all&#8217;interno della TextView il nuovo valore per la chiave key</p>
<p>&nbsp;</p>

<p><a href="http://feedads.g.doubleclick.net/~a/h1Mkm6ZvB8-_LBrEA1xa063CcbQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/h1Mkm6ZvB8-_LBrEA1xa063CcbQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/h1Mkm6ZvB8-_LBrEA1xa063CcbQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/h1Mkm6ZvB8-_LBrEA1xa063CcbQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/G6dozdfCnFk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/data-storage-shared-preferences/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/data-storage-shared-preferences/</feedburner:origLink></item>
		<item>
		<title>Data Storage: utilizzare database SQLite</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/UzbajYDtCU0/</link>
		<comments>http://www.danieleserio.it/data-storage-utilizzare-database-sqlite/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:28:11 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2851</guid>
		<description><![CDATA[Nella lezione precedente abbiamo focalizzato la nostra attenzione sullo storage di tipo interno per esempio su un file di testo [...]]]></description>
			<content:encoded><![CDATA[<p>Nella lezione precedente abbiamo focalizzato la nostra attenzione sullo storage di tipo interno per esempio su un file di testo nel quale è possibile andare a leggere e scrivere. Questo metodo risulta adatto per immagazzinare un quantitativo limitato di informazioni, mentre se si ha a che fare con set di dati di dimensione considerevole, la scrittura e lettura su file non risulta la scelta migliore.<span id="more-2851"></span></p>
<p>Questo tipo di problema diviene palese soprattutto qualora vi sia la necessità di effettuare ricerche all&#8217;interno dei dati salvati. Pensiamo infatti di voler trovare una certa parola in un file di testo contenente un set di dati molto grande e la parola cercata sia collocata nella parte finale del file. Ovviamente la ricerca richiederebbe diverso tempo in quanto sarebbe necessario scorrere l&#8217;intero file.</p>
<p>In queste situazioni è necessario utilizzare un database che migliori nettamente le prestazioni per quanto riguarda le operazioni che comunemente possono essere eseguite su un set di dati, come per esempio la ricerca, l&#8217;aggiornamento di un dato e la cancellazione.</p>
<p>Android ci mette a disposizione un database SQLite utilizzabile dalla nostra applicazione. Il linguaggio da utilizzare per compiere qualsiasi operazione sul database è ovviamente l&#8217;SQL. Se il lettore ha intenzione di sviluppare un&#8217;applicazione che utilizzi un database è opportuno che si documenti a fondo sul linguaggio SQL in generale e in particolare sule metodologie da adottare per ottimizzare le tabelle. Infatti un database non ottimizzato che possiede dei gravi errori concettuali può vanificare il vantaggio di avere un database, in quanto le prestazioni (calcolate sul tempo di esecuzione), per le varie operazioni base, calano vertiginosamente.</p>
<p>Dato che la progettazione di database ottimizzati e privi di errori concettuali esula dallo scopo di questa guida, in questa lazione forniremo al lettore solo le linee guide per utilizzare un database SQLite all&#8217;interno di un&#8217;applicazione (per approfondimenti sul linguaggio SQL rimandiamo all&#8217;apposita sezione su questo sito).</p>
<p>Iniziamo con il dire che ogni database che il programmatore crea è accessibile da qualsiasi classe facente parte dell&#8217;applicazione, ma non è visibile all&#8217;esterno dell&#8217;applicazione stessa.</p>
<p>Esistono diversi modi per creare un database, ma quello che risulta migliore è quello che mostreremo tra poco. Si tratta sostanzialmente di estendere la classe SQLiteOpenHelper e poi effettuare un overriding del metodo onCreate per poter creare le tabelle che sostanzialmente rappresenteranno la struttura del nostro database. Un esempio è mostrato nel codice seguente:</p>
<p><strong>public class MioDatabase extends SQLiteOpenHelper {</strong></p>
<p><strong> </strong></p>
<p><strong>  private static final int VERSIONE_DATABASE = 2;</strong></p>
<p><strong>  private static final int NOME_DATABASE = &#8220;Prova&#8221;;</strong></p>
<p><strong>  private static final String STRINGA_CREAZIONE_TABELLA = &#8220;CREATE TABLE prova (&#8221; nome TEXT primary key, cognome TEXT);&#8221;;</strong></p>
<p><strong> </strong></p>
<p><strong>  MioDatabase(Context context) {</strong></p>
<p><strong>    super(context, NOME_DATABASE, null, VERSIONE_DATABASE);</strong></p>
<p><strong>  </strong><strong>}</strong></p>
<p><strong> </strong></p>
<p><strong>  @Override</strong></p>
<p><strong>  public void onCreate(SQLiteDatabase db) {</strong></p>
<p><strong>    db.execSQL(STRINGA_CREAZIONE_TABELLA);</strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Come possiamo vedere vengono dichiarate tre costanti: una per la versione del database, una per il nome del database e una contente la query per la creazione di una tabella. Fatto ciò definiamo il costruttore della nostra classe, nella quale semplicemente andiamo a richiamare il metodo super (al quale vengono passati alcuni parametri) che richiamerà automaticamete il costruttore della classe SQLiteOpenHelper che abbiamo ereditato andando così a creare il databanse.</p>
<p>Infine nel metodo onCreate creiamo la nostra tabella invocando il metodo execSQL passandogli come attributo la stringa relativa alla creazione della tabella stessa.</p>
<p>Lasciamo a lettore &#8211; ed eventualmente a futuri articoli &#8211; il compito di approfondire l&#8217;argomento relativo al popolamento, alla modifica ed all&#8217;interrogazione del database all&#8217;interno di applicazioni Android</p>

<p><a href="http://feedads.g.doubleclick.net/~a/vzPF4bR5fhUvTcMazj7FQA2oOzk/0/da"><img src="http://feedads.g.doubleclick.net/~a/vzPF4bR5fhUvTcMazj7FQA2oOzk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vzPF4bR5fhUvTcMazj7FQA2oOzk/1/da"><img src="http://feedads.g.doubleclick.net/~a/vzPF4bR5fhUvTcMazj7FQA2oOzk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/UzbajYDtCU0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/data-storage-utilizzare-database-sqlite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/data-storage-utilizzare-database-sqlite/</feedburner:origLink></item>
		<item>
		<title>Data Storage: Internal Storage ed External Storage</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/zQBlllASqKs/</link>
		<comments>http://www.danieleserio.it/data-storage-internal-storage-ed-external-storage/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:27:06 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2849</guid>
		<description><![CDATA[Fino a questo momento abbiamo mostrato al lettore una panoramica molto ampia e approfondita per quanto riguarda lo sviluppo di [...]]]></description>
			<content:encoded><![CDATA[<p>Fino a questo momento abbiamo mostrato al lettore una panoramica molto ampia e approfondita per quanto riguarda lo sviluppo di applicazioni su piattaforma Android. A questo punto della guida il lettore sarà capace di utilizzare gli elementi mostrati per creare applicazioni anche di media complessità. Quello che però manca al lettore, ed è quello che andremo a spiegare in questo capitolo e nei successivi, è il modo con il quale è possibile <strong>salvare in maniera permanente alcuni dati</strong> (quando abbiamo a che fare con l&#8217;immagazzinamento di dati in maniera permanente solitamente si usa il termine <strong>Data Storage</strong>).</p>
<p>Per esempio si potrebbe avere la necessità di salvare delle preferenze immesse dall&#8217;utente in maniera permanente e permettere all&#8217;applicazione, durante l&#8217;avvio, di leggere queste preferenze e di agire di conseguenza. Android mette a disposizione diverse possibilità per il salvataggio dei dati in maniera permanente ed è compito del programmatore utilizzare la modalità più appropriata a seconda delle necessità.</p>
<p>Andiamo adesso a presentare le modalità che Android ci offre.</p>
<div>
<p><strong>Internal Storage</strong></p>
</div>
<p>E&#8217; una modalità estremamente semplice nella quale andiamo a creare un file, tipicamente un file di testo, nel quale possiamo scrive e leggere alcuni dati. Di default questo tipo di salvataggio è un <strong>salvataggio privato</strong> e ciò implica che il file può essere letto e scritto esclusivamente dall&#8217;applicazione che lo ha creato e non è dunque possibile accedervi da un&#8217;altra applicazione.<br /> Vediamo adesso, con queste poche righe di codice, un esempio pratico della creazione di un file:</p>
<p><strong>String nomeFile = &#8220;file_di_prova&#8221;;</strong></p>
<p><strong>String string = &#8220;Questo è un file scritto da MrWebMaster!&#8221;;</strong></p>
<p><strong>FileOutputStream fos = openFileOutput(nomeFile, Context.MODE_PRIVATE);</strong></p>
<p><strong>fos.write(string.getBytes());</strong></p>
<p><strong>fos.close();</strong></p>
<p>In questo codice semplicemente si dichiarano due variabili <em>string</em>, una per il nome del file e una per il contenuto del file stesso. Si apre poi uno stream per il file, si effettua la scrittura con il metodo <em>write</em> ed infine si chiude lo stream con il metodo <em>close</em>.</p>
<p>Se abbiamo la necessità di modificare la proprietà di default settata per la visibilità del file (che come abbiamo detto garantisce l&#8217;accesso alla sola applicazione che ha creato il file), dobbiamo agire sul secondo parametro del metodo <em>openFileOutput</em>. E&#8217; possibile infatti scegliere tra i seguenti valori:</p>
<ul>
<li><em>Context.MODE_WORLD_READABLE</em>: viene consentito l&#8217;accesso in lettura a tutte le applicazioni.</li>
<li><em>Context.MODE_WORLD_WRITEABLE</em>: viene consentito l&#8217;accesso in scrittura a tutte le applicazioni.</li>
</ul>
<p>Ricapitolando questa modalità di storage è una modalità molto semplice ed intuitiva; molto utilizzata nelle applicazioni data la sua facilità implementativa.</p>
<div>
<p><strong>External Storage</strong></p>
</div>
<p>Questo tipo di immagazzinamento dei dati permette il salvataggio di alcuni dati, da parte di un&#8217;applicazione, su dischi rimovibili dal dispositivo come per esempio una scheda SD. I file salvati su questo tipo di supporti vengono definiti <em>file world-readable</em> ovvero è concesso a tutti le applicazioni di leggerne il contenuto.</p>
<p>E&#8217; opportuno far notare al lettore la &#8220;pericolosità&#8221; dell&#8217;uso di questa metodologia di storage. Questo perché se si effettua il salvataggio di dati su un <em>External Storage</em> è opportuno controllare che i dati salvati non siano indispensabili per il corretto funzionamento dell&#8217;applicazione. Questo perché non si ha nessun controllo su questi dati nel caso in cui l&#8217;utente rimuova l&#8217;SD, la inserisca in un computer e per errore ne cancelli alcune parti.</p>
<p>Dunque si consiglia l&#8217;utilizzo di questa metodologia di storage in maniera parsimoniosa</p>

<p><a href="http://feedads.g.doubleclick.net/~a/rEI60_sYBPo9YsIXItFQGIExDuk/0/da"><img src="http://feedads.g.doubleclick.net/~a/rEI60_sYBPo9YsIXItFQGIExDuk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rEI60_sYBPo9YsIXItFQGIExDuk/1/da"><img src="http://feedads.g.doubleclick.net/~a/rEI60_sYBPo9YsIXItFQGIExDuk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/zQBlllASqKs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/data-storage-internal-storage-ed-external-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/data-storage-internal-storage-ed-external-storage/</feedburner:origLink></item>
		<item>
		<title>Richiamare una seconda activity dall’activity principale</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/I9PmcJejSBQ/</link>
		<comments>http://www.danieleserio.it/richiamare-una-seconda-activity-dallactivity-principale/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:25:23 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2847</guid>
		<description><![CDATA[Nella lezione precedente, introducendo le Intent, abbiamo introdotto uno strumento potentissimo per poter collegare più activity all&#8217;interno di un&#8217;applicazione. In [...]]]></description>
			<content:encoded><![CDATA[<p>Nella lezione precedente, introducendo le Intent, abbiamo introdotto uno strumento potentissimo per poter collegare più activity all&#8217;interno di un&#8217;applicazione. In questo modo sarà possibile realizzare applicazioni, anche di notevole complessità, delegando specifiche activity ad alcune operazioni e queste activity verranno attivate solo se necessario in seguito ad interazioni dell&#8217;utente.<span id="more-2847"></span></p>
<p>In questa lezione andremo a vedere come richiamare una seconda activity da quella principale.</p>
<p>Andiamo dunque a creare un nuovo progetto e come prima cosa andiamo a creare una nuova classe java chiamandola SecondaAttivita.java. All&#8217;interno di questo file inseriamo il seguente codice:</p>
<p><strong> </strong></p>
<p><strong>import android.app.Activity;</strong></p>
<p><strong>import android.os.Bundle;</strong></p>
<p><strong>import android.widget.TextView;</strong></p>
<p><strong>import android.view.LinearLayout;</strong></p>
<p><strong> </strong></p>
<p><strong>public class SecondaAttivita extends Activity {</strong></p>
<p><strong>  private TextView tv;   </strong></p>
<p><strong>  @Override</strong></p>
<p><strong>  public void onCreate(Bundle savedInstanceState) {</strong></p>
<p><strong>    LinearLayout linear = new LinearLayout(this);</strong></p>
<p><strong>      tv.setText(&#8220;Questa è la seconda activity&#8221;);     </strong></p>
<p><strong>      </strong><strong>linear.addView(tv);</strong></p>
<p><strong>      setContentView(linear);        </strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Come possiamo vedere anche questa seconda classe, essendo un activity, estenderà proprio la classe Activity.</p>
<p>Andiamo adesso ad editare il codice relativo all&#8217;activity principale della classe HelloWorld.java posizionandoci, ovviamente, nel metodo onCreate. Inseriamo dunque queste due semplici linee di codice:</p>
<p><strong>Intent miaIntent = new Intent(this, SecondaAttivita.class);</strong></p>
<p><strong>startActivity(miaIntent);</strong></p>
<p>Nella prima prima linea andiamo a istanziare un oggetto di tipo Intent e il tipo di intent che verrà creato sarà un&#8217;intent esplicita. Infatti viene utilizzato un costruttore nel quale dobbiamo specificare l&#8217;activity che lancia l&#8217;intent (nel nostro caso l&#8217;activity in cui ci troviamo e dunque passiamo come valore this) e l&#8217;activity a cui è diretta l&#8217;Intent.</p>
<p>Il metodo startActivity(miaIntent) è il metodo che si occupa di lanciare una nuova activity. Quest&#8217;ultima viene attivata per mezzo dell&#8217;intent che abbiamo creato nella riga precedente.</p>
<p>A questo punto se provassimo a lanciare la nostra applicazione continueremo, tuttavia, a vedere la stringa di saluto dell&#8217;activity principale invece che la stampa reativa alla seconda activity. Questo perché oltre a strutturare via codice la chiamata all&#8217;activity secondaria dobbiamo anche dichiararla all&#8217;interno del file AndroidManifest.xml.</p>
<p>Andiamo dunque ad aprire il file AndroidManifest.xml e dopo la dichiarazione dell&#8217;activity primaria inseriamo, nel listato XML, le seguenti righe di codice:</p>
<p><strong>&lt;activity android:name=&#8221;.SecondaAttivita&#8221;&gt;</strong></p>
<p><strong>&lt;/activity&gt;</strong></p>
<p>In questo modo abbiamo dichiarato la presenza dell&#8217;activity all&#8217;interno dell&#8217;AndroidManifest e se adesso lanciassimo la nostra applicazione otterremo il risultato sperato.</p>
<p>All&#8217;interno del file AndroidManifest, dentro la dichiarazione della nuova activity, è possibile impostare gli Intent Filter desiderati a seconda delle esigenze. In questo modo è possibile modellare il comportamento di ogni singola activity dandole la possibilità di rispondere ad intent con le medesime caratteristiche inserite nell&#8217;intent filter.</p>
<p>Nell&#8217;esempio precedente abbiamo presentato una seconda activity strutturata in maniera molto elementare. E&#8217; ovviamente possibile creare un nuovo file xml per strutturare un layout della window più complessa per poi passare come argomento al metodo setContentView della seconda activity proprio questo file<strong></strong></p>

<p><a href="http://feedads.g.doubleclick.net/~a/6C6Z3Awh-ThD9o4uLAyj4xu477Q/0/da"><img src="http://feedads.g.doubleclick.net/~a/6C6Z3Awh-ThD9o4uLAyj4xu477Q/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6C6Z3Awh-ThD9o4uLAyj4xu477Q/1/da"><img src="http://feedads.g.doubleclick.net/~a/6C6Z3Awh-ThD9o4uLAyj4xu477Q/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/I9PmcJejSBQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/richiamare-una-seconda-activity-dallactivity-principale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/richiamare-una-seconda-activity-dallactivity-principale/</feedburner:origLink></item>
		<item>
		<title>Intent ed Intent Filter</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/YE4T5ED3lQ8/</link>
		<comments>http://www.danieleserio.it/intent-ed-intent-filter/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:23:12 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2845</guid>
		<description><![CDATA[Fino a questo momento abbiamo presentato applicazioni di esempio che erano composte di una sola Activity. Solitamente, tuttavia, un&#8217;applicazione che [...]]]></description>
			<content:encoded><![CDATA[<p>Fino a questo momento abbiamo presentato applicazioni di esempio che erano composte di una sola Activity. Solitamente, tuttavia, un&#8217;applicazione che abbia un minimo di utilità e che sia strutturata con un certo criterio, consta di più activity ognuna delle quali è delegata a compiere alcune operazioni più o meno complesse.<span id="more-2845"></span></p>
<p>Come strutturare una seconda activity all&#8217;interno di un&#8217;applicazione risulta di ovvia intuizione, infatti sarà sufficiente creare un&#8217;altra classe Java che estenda la classe <em>Activity </em>per poi inserire questo nuovo file all&#8217;interno del nostro progetto. Quello che però manca al lettore, arrivato al punto di questa guida, è il collegamento che esiste tra due o più activity e il modo di richiamare un&#8217;altra activity da quella principale. Andiamo dunque a presentare l&#8217;oggetto <strong>Intent</strong> che permette proprio di richiamare una seconda activity da quella principale.</p>
<div>
<p><strong>Intent</strong></p>
</div>
<p>Un&#8217;Intent altro non è che un messaggio contenente un insieme di informazioni che vengono inviate ad un altro oggetto il quale, leggendole, effettua alcune operazione stabilite dal programmatore.</p>
<p>Ma quali sono le proprietà (e quindi le informazioni) che un Intent possiede? Vediamo insieme le più significative:</p>
<p>•             Component name: questa è un&#8217;informazione opzionale di un intent. Se settiamo unContent name andiamo a fare una dichiarazione esplicita di quale classe andrà a gestire l&#8217;intent stessa. La presenza o meno della presenza di questa informazione sta alla base della classificazione delle intent che vedremo in maniera più approfondita tra poco.</p>
<p>•             Action: altro non è che una stringa che identifica il tipo di operazione che sarà eseguita.</p>
<p>•             Data: con questa informazione si indica l&#8217;URI della risorsa che vogliamo elaborare. Per esempio un intent che ha la proprietà Action settata al valore ACTION_CALL (valore con il quale si richiede l&#8217;avvio di una chiamata) potrebbe avere come valore per la proprietà Data l&#8217;URI relativa al numero di telefono.</p>
<p>•             Category: è una stringa contenente informazione aggiuntive sul tipo di componente che andrà a gestire l&#8217;activity.</p>
<p>Come anticipato nel paragrafo precedente è possibile catalogare un intent sulla base del Content name. Infatti nel caso in cui venga specificato un gestore dell&#8217;intent si parlerà di Intent esplicita la quale è utilizzata principalmente per richiamare altre activity all&#8217;interno dell&#8217;applicazione chiamante; viceversa si parla di Intent implicita la quale è utilizzata principalmente per richiamare componenti di altre applicazioni.</p>
<p>Ovviamente il lettore si potrebbe chiedere: come fa il sistema operativo a gestire un&#8217; intent implicita se non viene specificato il gestore dell&#8217;intent? Per rispondere a questa domanda è indispensabile introdurre gli Intent Filter.</p>
<div>
<p><strong>Intent Filter</strong></p>
</div>
<p>Quest&#8217;ultimi altro non sono che delle direttive che hanno lo scopo di informare il sistema operativo quali intent l&#8217;applicazione è in grado di gestire. In questo modo, nel caso in cui il sistema operativo riceva un intent implicita di un certo tipo e quel tipo di intent è gestita da una applicazione, andorid potrebbe delegare proprio questa applicazione alla gestione dell&#8217;intent.</p>
<p>Per poter associare un Intent Filter alla nostra applicazione è necessario andare a modificare il file AndroidMAnifest.xml. Andando quindi ad aprire questo file all&#8217;interno di eclipse: qui possiamo vedere che dopo la dichiarazione dell&#8217;activity NomeACtivity al suo interno troviamo gli IntentFilter. Leggendo la tipologia di Intent che la nostra activity è in grado di gestire troviamo le intent che hanno alla proprietà action il valore android.intent.action.MAIN e alla proprietà category il valore android.intent.category.LAUNCHER.</p>
<p>Quella definizione di Intent Filter è necessaria per poter gestire l&#8217;intent che automaticamente viene inviata da android all&#8217;avvio dell&#8217;applicazione (quando l&#8217;utente clicca sull&#8217;icona relativa all&#8217;applicazione). Se provate, infatti, a togliere dal manifest le righe di codice relative all&#8217;Intent Filter vedrete che l&#8217;applicazione verrà installata correttamente ma non partirà</p>

<p><a href="http://feedads.g.doubleclick.net/~a/_8Qj9jK2ETGyNevTVJa7BBOMn6Y/0/da"><img src="http://feedads.g.doubleclick.net/~a/_8Qj9jK2ETGyNevTVJa7BBOMn6Y/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_8Qj9jK2ETGyNevTVJa7BBOMn6Y/1/da"><img src="http://feedads.g.doubleclick.net/~a/_8Qj9jK2ETGyNevTVJa7BBOMn6Y/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/YE4T5ED3lQ8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/intent-ed-intent-filter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/intent-ed-intent-filter/</feedburner:origLink></item>
		<item>
		<title>I menu in Android: creare un ContextMenu</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/PU7z4fEXgUg/</link>
		<comments>http://www.danieleserio.it/i-menu-in-android-creare-un-contextmenu/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:15:38 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2843</guid>
		<description><![CDATA[Nei capitoli precedenti abbiamo analizzato approfonditamente il menu del tipo IconMenu che sono, generalmente, i più utilizzati. Altra risorsa che Android ci [...]]]></description>
			<content:encoded><![CDATA[<p>Nei capitoli precedenti abbiamo analizzato approfonditamente il menu del tipo <em>IconMenu</em> che sono, generalmente, i più utilizzati. Altra risorsa che Android ci offre è il <strong>ContextMenu</strong> che può essere accomunato, come struttura e funzionamento, al menù che appare cliccando con il tasto destro del mouse su una qualsiasi icona di Windows.<span id="more-2843"></span></p>
<p>Il <em>ContextMenu</em> infatti non viene mostrato all&#8217;utente in seguito ad una pressione di un tasto sul dispositivo (come invece lo era per gli IconMenu), ma viene associato ad un determinato widget e viene visualizzato all&#8217;utente in seguito ad un click prolungato proprio su quel widget.</p>
<p>Ovviamente, all&#8217;interno di un&#8217;activity, è possibile creare dei ContextMenu diversi per poi associarli a widget diversi, oppure creare un&#8217;unico ContextMenu e associarlo a più widget diverse.</p>
<p>Andiamo adesso a mostrare il codice necessario per creare due diversi ContextMenu per poi associarne uno ad un bottone ed un&#8217;altro ad una TextView (prima di inserire il codice è necessario importare il pacchetto android.view.ContextMenu.*):</p>
<p><strong>public void onCreate(Bundle savedInstanceState) {</strong></p>
<p><strong>  super.onCreate(savedInstanceState);  </strong></p>
<p><strong>  LinearLayout mioLayout = new LinearLayout(this); </strong></p>
<p><strong>  </strong></p>
<p><strong>  Button bottone = new Button(this); </strong></p>
<p><strong>  bottone.setId(1);</strong></p>
<p><strong>  button1.setText(&#8220;Bottone associato ad un menù&#8221;); </strong></p>
<p><strong>        </strong></p>
<p><strong>  </strong><strong>TextView tv = new TextView(this);</strong></p>
<p><strong>  tv.setText(&#8220;Fai un click prolungato per il contextmenu&#8221;);</strong></p>
<p><strong>  </strong><strong>tv.setId(2);</strong></p>
<p><strong>  </strong></p>
<p><strong>  mioLayout.addView(bottone);</strong></p>
<p><strong>  mioLayout.addView(tv);</strong></p>
<p><strong>  setContentView(layout);</strong></p>
<p><strong>  </strong></p>
<p><strong>  registerForContextMenu(bottone); </strong></p>
<p><strong>  registerForContextMenu(tv);</strong></p>
<p><strong>}</strong></p>
<p><strong> </strong></p>
<p><strong>public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenuInfo menuInfo) {</strong></p>
<p><strong>  if(view.getId() == 1) {</strong></p>
<p><strong>    menu.setHeaderTitle(&#8220;ContextMenu del bottone&#8221;);</strong></p>
<p><strong>    menu.add(Menu.NONE, 1, 1, &#8220;Voce bottone 1&#8243;);</strong></p>
<p><strong>    menu.add(Menu.NONE, 2, 2, &#8220;Voce bottone 2&#8243;);</strong></p>
<p><strong>  </strong><strong>}</strong></p>
<p><strong>  else if(view.getId() == 2) {</strong></p>
<p><strong>    menu.setHeaderTitle(&#8220;ContextMenu della TextView&#8221;);</strong></p>
<p><strong>    menu.add(Menu.NONE, 3, 1, &#8220;Voce TextView 1&#8243;);</strong></p>
<p><strong>    menu.add(Menu.NONE, 4, 2, &#8220;Voce TextView 2&#8243;);</strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Facciamo l&#8217;analisi del codice proposto. Per quanto riguarda il contenuto del metodo onCreate le uniche linee di codice mai viste sono quelle relative all&#8217;invocazione del metodo registerForContextMenu che associa, al widget passato come parametro, un eventuale ContextMenu.</p>
<p>Di maggiore interesse risulta invece il metodo onCreateContextMenu che, di fato, contiene il codice relativo ai ContextMenu che vogliamo creare. Anche in questo caso, per creare un diverso menù per i due widget, abbiamo utilizzato il metodo getId() della view che ha richiamato il metodo onCreateContextMenu (il settaggio dell&#8217;id dei due widget viene eseguito nel metodo onCreate utilizzando setId()).</p>
<p>All&#8217;interno degli if andiamo ad aggiungere al menu le voci che desideriamo con il solito metodo add ed utilizziamo il metodo setHeaderTitle per impostare un titolo al ContextMenu.</p>
<p>Per poter associare un comportamento specifico alla pressione di uno dei tasti del menù si opera nella stessa maniera vista nel capitolo precedente per gli OptionMenu inserendo però il codice desiderato all&#8217;interno del metodo onContextItemSelected(MenuItem item)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/uX3fqonDqtK2TvUjhwZIE3mrr2M/0/da"><img src="http://feedads.g.doubleclick.net/~a/uX3fqonDqtK2TvUjhwZIE3mrr2M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uX3fqonDqtK2TvUjhwZIE3mrr2M/1/da"><img src="http://feedads.g.doubleclick.net/~a/uX3fqonDqtK2TvUjhwZIE3mrr2M/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/PU7z4fEXgUg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/i-menu-in-android-creare-un-contextmenu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/i-menu-in-android-creare-un-contextmenu/</feedburner:origLink></item>
		<item>
		<title>I menu in Android: OptionsMenu e associazione di un listener</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/uhYrPdnEwso/</link>
		<comments>http://www.danieleserio.it/i-menu-in-android-optionsmenu-e-associazione-di-un-listener/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:07:39 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2840</guid>
		<description><![CDATA[In questa lezione andremo ad analizzare il codice relativo all&#8217;OptionsMenu che abbiamo creato al la lezione precedente. Il codice all&#8217;interno [...]]]></description>
			<content:encoded><![CDATA[<p>In questa lezione andremo ad analizzare il codice relativo all&#8217;OptionsMenu che abbiamo creato al la lezione precedente.</p>
<p>Il codice all&#8217;interno del metodo <em>onCreate</em>, a questo punto della guida, dovrebbe essere di chiara comprensione per il lettore e dunque ne viene volutamente omessa l&#8217;analisi. Concentriamo invece la nostra attenzione su un nuovo metodo che ancora non avevamo visto: il metodo <strong>OnCreateOptionMenu(Menu menu)</strong>.<span id="more-2840"></span></p>
<p>Questo metodo viene richiamato automaticamente dall&#8217;Activity non appena l&#8217;utente clicca sul tasto <em>menu</em> del simulatore o del dispositivo fisico. Di default il menu è vuoto ed è dunque necessario ridefinire il metodo sopra presentato per poter visualizzare un menù personalizzato. Come possiamo vedere il metodo restituisce un valore <em>booleano</em>: <em>true</em> avrà l&#8217;effetto di notificare all&#8217;activity di mostrare il menu, mentre <em>false</em> avrà l&#8217;effetto contrario (il menù non verrà visualizzato).</p>
<p>Continuando con l&#8217;analisi del codice troviamo il metodo che permette di aggiungere una voce al menù che stiamo creando. Il prototipo di questo metodo è il seguente:</p>
<p><strong>add(int groupId, int itemId, int order, CharSequence title)</strong></p>
<ul>
<li>Il parametro <em>groupId</em> è un parametro che indica il gruppo di appartenenza della voce del menu (nel nostro caso abbiamo utilizzato <em>Menu.NONE</em> perché non vogliamo utilizzare nessun gruppo);</li>
<li><em>itemId</em> indica l&#8217;id che verrà associata alla voce del menù (tornerà utile in fase di identificazione di quale voce del menu l&#8217;utente ha cliccato);</li>
<li><em>order</em> serve per specificare la posizione della voce del menù all&#8217;interno del menù stesso;</li>
<li><em>title</em> specifica la stringa di testo che verrà mostrata all&#8217;utente.</li>
</ul>
<p>Come abbiamo detto è possibile sostituire il testo della voce del menù con un&#8217;immagine. In questo caso è necessario importare la classe <em>anroid.view.MenuItem</em> e sostituire il codice relativo all&#8217;aggiunta di una voce del menù con il seguente:</p>
<p><strong>MenuItem voce1 = menu.add(Menu.NONE, 1, 1, &#8220;voce1&#8243;); </strong></p>
<p><strong>voce1.setIcon(R.drawable.icon);</strong></p>
<p>Come possiamo vedere è necessario creare un oggetto <em>MenuItem</em> utilizzando il metodo <em>add </em>presentato qualche paragrafo prima e poi invocare il metodo <em>setIcon</em> su questo nuovo oggetto.</p>
<div>
<p><span style="text-decoration: underline;"><span style="font-size: medium;"><strong>Associamo un listener ad ogni voce di menu</strong></span></span></p>
</div>
<p>E&#8217; possibile, seguendo la tecnica già utilizzata con i bottoni, creare un oggetto di tipo <em>MenuItem</em>, associargli un listener e poi fare l&#8217;override del metodo che cattura il click.<br /> In questa guida, tuttavia, presenteremo un altro metodo, più semplice e di più facile implementazione, nel quale utilizzeremo la prima implementazione del menù (quella senza la dichiarazione dell&#8217;oggetto <em>MenuItem</em>) ed andremo ad aggiungere il metodo <strong>onOptionsItemSelected(MenuItem item)</strong> che rappresenta il listener che è necessario utilizzare per i menù. Vediamo adesso il codice da aggiungere:</p>
<p><strong>public boolean onOptionsItemSelected(MenuItem item) { </strong></p>
<p><strong>  int id = item.getItemId();    </strong></p>
<p><strong>  switch (id) {</strong></p>
<p><strong>    </strong><strong>case 1:</strong></p>
<p><strong>      textView.setText(&#8220;Ho cliccato la voce &#8220;+ id + &#8221; del menù&#8221;);</strong></p>
<p><strong>      break;</strong></p>
<p><strong>    case 2:</strong></p>
<p><strong>      textView.setText(&#8220;Ho cliccato la voce &#8220;+ id + &#8221; del menù&#8221;);</strong></p>
<p><strong>      break;</strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Per esigenze di spazio abbiamo gestito solo il click sulle prime due voci del menù, si lascia per esercizio al lettore il completamento del <em>case</em>.<br /> Il codice mostrato è molto semplice infatti si memorizza nella variabile <em>id</em> l&#8217;identificativo numerico associato alla voce del menù che è stata cliccata. Ciò viene effettuato con la chiamata, sull&#8217;oggetto <em>item</em>, del metodo <em>getId()</em>.<br /> All&#8217;interno di ogni <em>case</em> inseriremo il codice che modella il comportamento dell&#8217;applicazione al click della voce del menù che solitamente richiama un&#8217;altra activity sostituendola a quella attuale (vedremo più avanti come fare)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/g-4YAaGOIjgFU9bqUsu2mfHQBLY/0/da"><img src="http://feedads.g.doubleclick.net/~a/g-4YAaGOIjgFU9bqUsu2mfHQBLY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/g-4YAaGOIjgFU9bqUsu2mfHQBLY/1/da"><img src="http://feedads.g.doubleclick.net/~a/g-4YAaGOIjgFU9bqUsu2mfHQBLY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/uhYrPdnEwso" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/i-menu-in-android-optionsmenu-e-associazione-di-un-listener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/i-menu-in-android-optionsmenu-e-associazione-di-un-listener/</feedburner:origLink></item>
		<item>
		<title>I menu in Android: cosa sono gli OptionsMenu</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/DkW75DDvVrg/</link>
		<comments>http://www.danieleserio.it/i-menu-in-android-cosa-sono-gli-optionsmenu/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:05:20 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2835</guid>
		<description><![CDATA[Una generica applicazione degna di questa nome dovrà possedere un menù dal quale l&#8217;utente potrà scegliere tra le diverse operazioni [...]]]></description>
			<content:encoded><![CDATA[<p>Una generica applicazione degna di questa nome dovrà possedere un menù dal quale l&#8217;utente potrà scegliere tra le diverse operazioni da eseguire. In questo capitolo, e in quelli che seguiranno, andremo a presentare i menù che Android ci mette a disposizione imparando a gestire il click su ogni voce del menù.<span id="more-2835"></span></p>
<div>
<p><span style="text-decoration: underline; font-size: medium;"><strong>OptionsMenu</strong></span></p>
</div>
<p>Iniziamo con il presentare gli <strong>OptionsMenu</strong>. Questo tipo di menù è posizionato nella parte bassa dello schermo ed è possibile individuarne due strutture principali: gli <strong>icon menu</strong> e gli<strong>expanded menu</strong>.</p>
<div>
<p><span style="text-decoration: underline;"><strong>Icon menu e expanded menu</strong></span></p>
</div>
<p>Gli <strong>Icon Menu</strong> solitamente contengono le operazioni più importanti che un utente può eseguire all&#8217;interno dell&#8217;applicazione. Come detto vengono posizionati nella parte bassa dello schermo e sono visibili all&#8217;utente solamente dopo la pressione del tasto <em>menù</em> del dispositivo (ciò vale anche sul simulatore).</p>
<p>Una pratica molto usata è quella di inserire in questo menù delle icone che sintetizzano il risultato dell&#8217;operazione che verrà effettuata al click della voce del menù. Se per esempio facciamo riferimento ad un&#8217;applicazione per la riproduzione di brani musicali, si potrebbe pensare di associare alla voce del menù <em>play</em> l&#8217;icona associata a quella operazione (il tringolino iscritto in un cerchio).</p>
<p>Per quanto riguarda questo menù abbiamo una limitazione sul numero di voci che è possibile inserire e questo numero è pari a sei. Ma cosa succede se inseriamo un numero di voci maggiori di sei? semplicemente la sesta voce del menù verrà mutata in una voce altroche se cliccata aprirà un expanded menu contenente le altre voci. Quest&#8217;ultime verranno visualizzate in una lista a tutto schermo che si espanderà dal basso verso l&#8217;alto andando progressivamente a coprire il contenuto base della window dell&#8217;activity.</p>
<p>&nbsp;</p>
<p>Detto ciò è opportuno mostrare un po&#8217; di codice (da inserire all&#8217;interno della nostra activity) che andrà a creare un Options menù che sarà formato da Icon menu e da Expanded menù (prima è necessario importare la classe android.view.Menu):</p>
<p align="center"><a href="http://www.danieleserio.it/wp-content/uploads/2012/04/m1.jpg"><img title="m1" src="http://www.danieleserio.it/wp-content/uploads/2012/04/m1-225x300.jpg" alt="" width="225" height="300" /></a> </p>
<p><strong>public void onCreate(Bundle savedInstanceState) {</strong></p>
<p><strong>  super.onCreate(savedInstanceState);</strong></p>
<p><strong>  LinearLayout linearLayout = new LinearLayout(this);</strong></p>
<p><strong>  TextView textView = new TextView(this);</strong></p>
<p><strong>  textView.setText(&#8220;Clicca sul tasto menù del simulatore&#8221;);</strong></p>
<p><strong>  </strong><strong>linearLayout.addView(textView);</strong></p>
<p><strong>  setContentView(linearLayout);   </strong></p>
<p><strong>}</strong></p>
<p><strong> </strong></p>
<p><strong>public boolean onCreateOptionsMenu(Menu menu) { </strong></p>
<p><strong>  menu.add(Menu.NONE, 1, 1, &#8220;Voce 1&#8243;);</strong></p>
<p><strong>  menu.add(Menu.NONE, 2, 2, &#8220;Voce 2&#8243;); </strong></p>
<p><strong>  menu.add(Menu.NONE, 3, 3, &#8220;Voce 3&#8243;); </strong></p>
<p><strong>  menu.add(Menu.NONE, 4, 4, &#8220;Voce 4&#8243;);</strong></p>
<p><strong>  menu.add(Menu.NONE, 5, 5, &#8220;Voce 5&#8243;);</strong></p>
<p><strong>  menu.add(Menu.NONE, 6, 6, &#8220;Voce 6&#8243;); </strong></p>
<p><strong>  menu.add(Menu.NONE, 7, 7, &#8220;Voce 7&#8243;); </strong></p>
<p><strong>  menu.add(Menu.NONE, 8, 8, &#8220;Voce 8&#8243;); </strong></p>
<p><strong>  return true;</strong></p>
<p><strong>}</strong></p>
<p>Come detto precedentemente se clicchiamo sul tasto menu del simulatore renderemo visibile l&#8217;icon menu raffigurato nello screenshot seguente:</p>
<p align="center"><a href="http://www.danieleserio.it/wp-content/uploads/2012/04/m2.jpg"><br /><img title="m2" src="http://www.danieleserio.it/wp-content/uploads/2012/04/m2-227x300.jpg" alt="" width="227" height="300" /></a><a href="http://www.danieleserio.it/wp-content/uploads/2012/04/m1.jpg"><br /></a></p>
<p>&nbsp;</p>
<p>In accordo con quanto detto, dato che abbiamo inserito un numero di voci superiore a sei, l&#8217;ultima voce sarà il punto di accesso all&#8217;expanded menu che è possibile vedere in questo screnshot:</p>
<p align="center"> <a href="http://www.danieleserio.it/wp-content/uploads/2012/04/m3.jpg"><img class="aligncenter size-medium wp-image-2836" title="m3" src="http://www.danieleserio.it/wp-content/uploads/2012/04/m3-227x300.jpg" alt="" width="227" height="300" /></a><a href="http://www.danieleserio.it/wp-content/uploads/2012/04/m2.jpg"><br /></a></p>
<p>Come possiamo vedere una volta cliccato qualunque delle voci del menù, quest&#8217;ultimo tornerà invisibile all&#8217;utente.</p>
<p>Nel prossimo capitolo analizzeremo il codice presentato ed assoceremo un particolare listener alle voci del menu</p>
<div>
<p>Menu: OptionsMenu e associazione di un listener</p>
</div>
<p>In questa lezione andremo ad analzizare il codice relativo all&#8217;OptionsMenu che abbiamo creato al la lezione precedente.</p>
<p>Il codice all&#8217;interno del metodo <em>onCreate</em>, a questo punto della guida, dovrebbe essere di chiara comprensione per il lettore e dunque ne viene volutamente omessa l&#8217;analisi. Concentriamo invece la nostra attenzione su un nuovo metodo che ancora non avevamo visto: il metodo <strong>OnCreateOptionMenu(Menu menu)</strong>.</p>
<p>Questo metodo viene richiamato automaticamente dall&#8217;Activity non appena l&#8217;utente clicca sul tasto <em>menu</em> del simulatore o del dispositivo fisico. Di default il menu è vuoto ed è dunque necessario ridefinire il metodo sopra presentato per poter visualizzare un menù personalizzato. Come possiamo vedere il metodo restituisce un valore <em>booleano</em>: <em>true</em> avrà l&#8217;effetto di notificare all&#8217;activity di mostrare il menu, mentre <em>false</em> avrà l&#8217;effetto contrario (il menù non verrà visualizzato).</p>
<p>Continuando con l&#8217;analisi del codice troviamo il metodo che permette di aggiungere una voce al menù che stiamo creando. Il prototipo di questo metodo è il seguente:</p>
<p><strong>add(int groupId, int itemId, int order, CharSequence title)</strong></p>
<ul>
<li>Il parametro <em>groupId</em> è un parametro che indica il gruppo di appartenenza della voce del menu (nel nostro caso abbiamo utilizzato <em>Menu.NONE</em> perché non vogliamo utilizzare nessun gruppo);</li>
<li><em>itemId</em> indica l&#8217;id che verrà associata alla voce del menù (tornerà utile in fase di identificazione di quale voce del menu l&#8217;utente ha cliccato);</li>
<li><em>order</em> serve per specificare la posizione della voce del menù all&#8217;interno del menù stesso;</li>
<li><em>title</em> specifica la stringa di testo che verrà mostrata all&#8217;utente.</li>
</ul>
<p>Come abbiamo detto è possibile sostituire il testo della voce del menù con un&#8217;immagine. In questo caso è necessario importare la classe <em>anroid.view.MenuItem</em> e sostituire il codice relativo all&#8217;aggiunta di una voce del menù con il seguente:</p>
<p><strong>MenuItem voce1 = menu.add(Menu.NONE, 1, 1, &#8220;voce1&#8243;); </strong></p>
<p><strong>voce1.setIcon(R.drawable.icon);</strong></p>
<p>Come possiamo vedere è necessario creare un oggetto <em>MenuItem</em> utilizzando il metodo <em>add</em>presentato qualche paragrafo prima e poi invocare il metodo <em>setIcon</em> su questo nuovo oggetto.</p>
<div>
<p><span style="text-decoration: underline; font-size: medium;"><strong>Associamo un listener ad ogni voce di menu</strong></span></p>
</div>
<p>E&#8217; possibile, seguendo la tecnica già utilizzata con i bottoni, creare un oggetto di tipo<em>MenuItem</em>, associargli un listener e poi fare l&#8217;override del metodo che cattura il click.<br /> In questa guida, tuttavia, presenteremo un altro metodo, più semplice e di più facile implementazione, nel quale utilizzeremo la prima implementazione del menù (quella senza la dichiarazione dell&#8217;oggetto <em>MenuItem</em>) ed andremo ad aggiungere il metodo<strong>onOptionsItemSelected(MenuItem item)</strong> che rappresenta il listener che è necessario utilizzare per i menù. Vediamo adesso il codice da aggiungere:</p>
<p><strong>public boolean onOptionsItemSelected(MenuItem item) { </strong></p>
<p><strong>  int id = item.getItemId();    </strong></p>
<p><strong>  switch (id) {</strong></p>
<p><strong>    </strong><strong>case 1:</strong></p>
<p><strong>      textView.setText(&#8220;Ho cliccato la voce &#8220;+ id + &#8221; del menù&#8221;);</strong></p>
<p><strong>      break;</strong></p>
<p><strong>    </strong></p>
<p><strong>    case 2:</strong></p>
<p><strong>      textView.setText(&#8220;Ho cliccato la voce &#8220;+ id + &#8221; del menù&#8221;);</strong></p>
<p><strong>      break;</strong></p>
<p><strong>  }</strong></p>
<p><strong>}</strong></p>
<p>Per esigenze di spazio abbiamo gestito solo il click sulle prime due voci del menù, si lascia per esercizio al lettore il completamento del <em>case</em>.<br /> Il codice mostrato è molto semplice infatti si memorizza nella variabile <em>id</em> l&#8217;identificativo numerico associato alla voce del menù che è stata cliccata. Ciò viene effettuato con la chiamata, sull&#8217;oggetto <em>item</em>, del metodo <em>getId()</em>.<br /> All&#8217;interno di ogni <em>case</em> inseriremo il codice che modella il comportamento dell&#8217;applicazione al click della voce del menù che solitamente richiama un&#8217;altra activity sostituendola a quella attuale (vedremo più avanti come fare)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/SO0lula_qOfKEKhxWy3wIbTMW-4/0/da"><img src="http://feedads.g.doubleclick.net/~a/SO0lula_qOfKEKhxWy3wIbTMW-4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SO0lula_qOfKEKhxWy3wIbTMW-4/1/da"><img src="http://feedads.g.doubleclick.net/~a/SO0lula_qOfKEKhxWy3wIbTMW-4/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/DkW75DDvVrg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/i-menu-in-android-cosa-sono-gli-optionsmenu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/i-menu-in-android-cosa-sono-gli-optionsmenu/</feedburner:origLink></item>
		<item>
		<title>I Layout in Android: TableLayout, FrameLayout e RelativeLayout</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/VYzUbSHn4zA/</link>
		<comments>http://www.danieleserio.it/i-layout-in-android-tablelayout-framelayout-e-relativelayout/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:00:40 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2832</guid>
		<description><![CDATA[Il TableLayout è un layout molto particolare che permette di organizzare i contenuti come se stessimo lavorando con una tabella. Un esempio [...]]]></description>
			<content:encoded><![CDATA[<p>Il <strong>TableLayout</strong> è un layout molto particolare che permette di organizzare i contenuti come se stessimo lavorando con una tabella. Un esempio di applicazione che potrebbe sfruttare questo tipo di layout può essere offerto da una galleria d&#8217;immagini dove si potrebbe pensare di mostrare all&#8217;utente una serie di miniature dell&#8217;immagine organizzate in maniera ordinata utilizzando un TableLayout e poi ingrandire l&#8217;immagine cliccata dall&#8217;utente.<span id="more-2832"></span></p>
<p>I contenuti all&#8217;interno di un TableLayout vengono organizzati grazie ad un oggetto<strong>TableRow</strong> che identifica una riga della tabella. All&#8217;interno di questo oggetto dovremo inserire tutti gli elementi che vogliamo mostrare in quella specifica riga.</p>
<p>Mostriamo adesso un esempio chiarificatore andando a creare un TableLayout con quattro righe e quattro colonne. Il codice Java per crearlo è il seguente (anche in questo caso per comodità importiamo <em>andorid.widget.*</em>):</p>
<p><strong>TableLayout tableLayout = new TableLayout(this); </strong></p>
<p><strong>tableLayout.setGravity(Gravity.TOP); </strong></p>
<p><strong> </strong></p>
<p><strong>int count=0;</strong></p>
<p><strong>for (int i = 0; i &lt; 4; i++) {</strong></p>
<p><strong>  TableRow tableRow = new TableRow(this); </strong></p>
<p><strong>  tableRow.setGravity(Gravity.CENTER);</strong></p>
<p><strong>  for (int j = 0; j &lt; 4; j++) { </strong></p>
<p><strong>    count++;</strong></p>
<p><strong>    TextView testoCella = new TextView(this); </strong></p>
<p><strong>    testoCella.setText(&#8220;cella &#8220;+ count); </strong></p>
<p><strong>    testoCella.setPadding(10, 10, 10, 10);</strong></p>
<p><strong>    tableRow.addView(testoCella);</strong></p>
<p><strong>  }</strong></p>
<p><strong>  tableLayout.addView(tableRow);</strong></p>
<p><strong>} </strong></p>
<p><strong>                </strong></p>
<p><strong>setContentView(tableLayout);</strong></p>
<p>Andiamo adesso a fare un&#8217;analisi rigorosa del codice. Come prima cosa viene creato un oggetto di tipo <em>TableLayout</em> che viene posizionato nella parte alta dello schermo. La costruzione del layout vera e propria viene eseguita per mezzo di due <em>for</em> annidati.<br /> Nel primo <em>for</em> dichiariamo un oggetto di tipo <em>tableRow</em> e settiamo la proprietà <em>gravity</em> per centrare il contenuto all&#8217;interno dell&#8217;oggetto.<br /> Ad ogni iterazione del secondo <em>for</em> andiamo a riempire la <em>tableRow</em> con una <em>TextView</em>(utilizziamo la variabile count incrementata ad ogni iterazione), poi applichiamo un <em>padding </em>di 10 pixel dai quattro bordi della cella ed infine associamo la <em>TextView</em> alla <em>TableRow</em> creata nel <em>for</em> primario.<br /> Al termine del primo <em>for</em> aggiungiamo la <em>TableRow</em> (contenente tutte e quattro le nostre TextView create col ciclo annidato) al <em>TableLayout</em>. Infine, con il solito comando <em>setContentView</em>, andiamo ad associare il TableLayout creato alla window della nostra activity</p>
<p>Il risultato finale è mostrato nello screenshot di seguito:</p>
<p align="center"><a href="http://www.danieleserio.it/wp-content/uploads/2012/04/l1.jpg"><img class="aligncenter size-full wp-image-2833" title="l1" src="http://www.danieleserio.it/wp-content/uploads/2012/04/l1.jpg" alt="" width="265" height="147" /></a> </p>
<p>Oltre ai due Layout visti precedentemente ne esistono altri due di più semplice utilizzo: <strong>FrameLayout</strong> e <strong>RelativeLayout</strong>. Il primo è un layout elementare infatti può contenere un solo <em>widget</em> e lo estende per tutta la grandezza disponibile partendo dal punto in alto a sinistra dello schermo. Il secondo invece posizione l&#8217;elemento nella window con le sue dimensioni originali e dunque senza effettuare nessun ridimensionamento.</p>
<p>Ovviamente, in una window, è possibile utilizzare contemporaneamente più tipi di layout, ricordandoci però di inglobarli poi in un unico layout che verrà passato come argomento al metodo <em>setContentView</em>. Un esempio di quanto detto è mostrato nel codice seguente:</p>
<p><strong>LinearLayout linearLayout1 = new LinearLayout(this);</strong></p>
<p><strong>//Codice relativo all&#8217;inserimento di elementi per questo layout</strong></p>
<p><strong>TableLayout tableLayout = new TableLayout(this);</strong></p>
<p><strong>//Codice relativo all&#8217;inserimento di elementi per questo layout</strong></p>
<p><strong><br /></strong></p>
<p><strong>LinearLayout linearLayoutPrimario = new LinearLayout(this);</strong></p>
<p><strong>linearLayoutPrimario.setOrientation(LinearLayout.VERTICAL);</strong></p>
<p><strong>linearLayoutPrimario.addView(linearLayout1);</strong></p>
<p><strong>linearLayoutPrimario.addView(tableLayout);</strong></p>
<p><strong> </strong></p>
<p><strong>setContentView(linearLayoutPrimario);</strong><strong></strong></p>

<p><a href="http://feedads.g.doubleclick.net/~a/bwRxICWkDX6QgX5ps0I9vYPx0l0/0/da"><img src="http://feedads.g.doubleclick.net/~a/bwRxICWkDX6QgX5ps0I9vYPx0l0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bwRxICWkDX6QgX5ps0I9vYPx0l0/1/da"><img src="http://feedads.g.doubleclick.net/~a/bwRxICWkDX6QgX5ps0I9vYPx0l0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/VYzUbSHn4zA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/i-layout-in-android-tablelayout-framelayout-e-relativelayout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/i-layout-in-android-tablelayout-framelayout-e-relativelayout/</feedburner:origLink></item>
		<item>
		<title>I layout in Android: il LinearLayout</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/lFgdOt1oBf8/</link>
		<comments>http://www.danieleserio.it/i-layout-in-android-il-linearlayout/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:41:17 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2827</guid>
		<description><![CDATA[Arrivati a questo punto della guida sono stati presentati molti argomenti e mostrato il codice relativo alla creazione di tutti [...]]]></description>
			<content:encoded><![CDATA[<p>Arrivati a questo punto della guida sono stati presentati molti argomenti e mostrato il codice relativo alla creazione di tutti i principali widget. Quello che ancora manca è un approfondimento sul posizionamento di tali elementi, il quale viene effettuato grazie ai <strong>layout</strong>.<br /> Nei capitoli introduttivi abbiamo accennato al <em>LinearLayout</em> ed in questa parte della guida andremo ad analizzare in maniera più approfondita questo layout e tutti gli altri messi a disposizione da Android.<span id="more-2827"></span></p>
<div>
<p><strong>LinearLayout</strong></p>
</div>
<p>E&#8217; uno tra i layout più utilizzati in quasi tutte le applicazioni Android. La particolarità di questo layout, come abbiamo visto, è quello di disporre gli elementi inseriti nella window dell&#8217;activity uno di seguito all&#8217;altro.</p>
<p>A seconda del valore dell&#8217;orientazione del LinearLayout si parla di LinearLayout verticale (gli elementi vengono disposti uno dopo l&#8217;altro dall&#8217;alto verso il basso) e LinearLayout orizzontale (gli elementi vengono disposti uno dopo l&#8217;altro da sinistra verso destra). Per poter settare l&#8217;orientamento del layout è sufficiente, nel file .xml utilizzato, editare la seguente proprietà con il valore <em>vertical</em> o <em>horizontal</em>:</p>
<p><strong>android:orientation=&#8221;"</strong><strong></strong></p>
<p>Come detto i componenti aggiunti al layout vengono disposti su una linea verticale o orizzontale a seconda dell&#8217;orientamento dato al layout. Questi elementi vengono aggiunti alla window finche c&#8217;è spazio e non appena si richiede l&#8217;inserimento di un ulteriore elemento, android cerca di ridimensionarlo per inserirlo comunque all&#8217;interno dello schermo. Questo comportamento è limitato ad una soglia dopo la quale, semplicemente, gli elementi aggiunti non vengano visualizzati sullo schermo.</p>
<p>Si sconsiglia al lettore di non inserire mai elementi in eccesso nella window in quanto il ridimensionamento automatico fatto da Android spesso deforma i componenti inseriti rendendo l&#8217;interfaccia grafica poco gradevole se non, addirittura, poco usabile. Inoltre gli elementi che Android, per mancanza di spazio, non mostra a schermo risiedono comunque in memoria andando a sprecare dello spazio prezioso.</p>
<p>Per mostrare un esempio di quanto detto, andiamo a costruire un LinearLayout orizzontale con tre bottoni, a cui poi ne aggiungeremo un quarto per mostrare il ridimensionamento e l&#8217;interfaccia grafica che ne scaturisce. A differenza di quanto visto finora, creeremo l&#8217;interfaccia grafica direttamente da codice Java senza appoggiarsi ad un file esterno .xml. Ciò viene mostrato al lettore per presentare questo diverso modo di operare (per comodità importiamo direttamente android.widget.*):</p>
<p>LinearLayout layout = new LinearLayout(this);</p>
<p>layout.setOrientation(LinearLayout.HORIZONTAL);</p>
<p>layout.setGravity(Gravity.BOTTOM);</p>
<p>&nbsp;</p>
<p>Button button1 = new Button (this);</p>
<p>button1.setText(&#8220;Bottone 1&#8243;);</p>
<p>Button button2 = new Button (this);</p>
<p>button2.setText(&#8220;Bottone 2&#8243;);</p>
<p>Button button3 = new Button (this);</p>
<p>button3.setText(&#8220;Bottone 3&#8243;);</p>
<p>&nbsp;</p>
<p>layout.addView(button1);</p>
<p>layout.addView(button2);</p>
<p>layout.addView(button3);</p>
<p>setContentView(layout);</p>
<p>Come prima cosa dichiariamo un oggetto di tipo LinearLayout, poi settiamo l&#8217;orientamento orizzontale del layout ed infine settiamo la posizione (in basso dello schermo) dove andremo a posizionare i nostri oggetti. Dichiariamo poi tre bottoni, li associamo al layout con addView ed infine utilizziamo il metodo setContentView per associare il layout alla window dell&#8217;activity.</p>
<p>Andiamo adesso ad inserire un quarto bottone (si lascia per esercizio al lettore la scrittura del codice) al layout e come possiamo vedere dallo screenshot seguente il ridimensionamento sforma il bottone mostrando un&#8217;interfaccia non molto professionale:</p>
<p align="center"> <a href="http://www.danieleserio.it/wp-content/uploads/2012/04/b1.jpg"><img class="aligncenter size-medium wp-image-2828" title="b1" src="http://www.danieleserio.it/wp-content/uploads/2012/04/b1-300x51.jpg" alt="" width="300" height="51" /></a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/yAuaihzE9aM8s4Pq7QEPYtpi7V4/0/da"><img src="http://feedads.g.doubleclick.net/~a/yAuaihzE9aM8s4Pq7QEPYtpi7V4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yAuaihzE9aM8s4Pq7QEPYtpi7V4/1/da"><img src="http://feedads.g.doubleclick.net/~a/yAuaihzE9aM8s4Pq7QEPYtpi7V4/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/lFgdOt1oBf8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/i-layout-in-android-il-linearlayout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/i-layout-in-android-il-linearlayout/</feedburner:origLink></item>
		<item>
		<title>Android: aggiungere bottoni ad un AlertDialog</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/FZKYc5_vyg0/</link>
		<comments>http://www.danieleserio.it/android-aggiungere-bottoni-ad-un-alertdialog/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:38:36 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2825</guid>
		<description><![CDATA[Ovviamente una AlertDialog strutturata come quella del capitolo precedente non è molto utile in quanto non presenta alcun bottone e [...]]]></description>
			<content:encoded><![CDATA[<p>Ovviamente una AlertDialog strutturata come quella del capitolo precedente non è molto utile in quanto non presenta alcun bottone e di fatto blocca l&#8217;applicazione in quanto non c&#8217;è modo di rimuoverla dallo schermo.<br /> Prima di aggiungere dei bottoni all&#8217;AlertDialog, però, è necessario aggiungere un oggetto TextView nel quale andremo a scrivere un messaggio diverso a seconda del bottone cliccato dall&#8217;utente. L&#8217;aggiunta del campo TextVIew viene lasciato per esercizio al lettore.<span id="more-2825"></span></p>
<p>Per l&#8217;aggiunta dei bottoni nella ALertDialog e dell&#8217;associazione dei listener è sufficiente sostituire il codice scritto nel capitolo precedente con il seguente:</p>
<p><strong>AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);</strong></p>
<p><strong>miaAlert.setMessage(&#8220;Verifichiamo il funzionamento dei bottoni aggiunti!&#8221;);</strong></p>
<p><strong>miaAlert.setTitle(&#8220;AlertDialog di MrWebMaster&#8221;);</strong></p>
<p><strong> </strong></p>
<p><strong>miaAlert.setCancelable(false);</strong></p>
<p><strong>miaAlert.setPositiveButton(&#8220;Si&#8221;, new DialogInterface.OnClickListener() {</strong></p>
<p><strong>  public void onClick(DialogInterface dialog, int id) {</strong></p>
<p><strong>    tv.setText(&#8220;Ho cliccato il tasto SI&#8221;);</strong></p>
<p><strong>  }</strong></p>
<p><strong>});</strong></p>
<p><strong>                </strong></p>
<p><strong>miaAlert.setNegativeButton(&#8220;No&#8221;, new DialogInterface.OnClickListener() {</strong></p>
<p><strong>  public void onClick(DialogInterface dialog, int id) {</strong></p>
<p><strong>    tv.setText(&#8220;Ho cliccato il tasto NO&#8221;);                               </strong></p>
<p><strong>  </strong><strong>}</strong></p>
<p><strong>});</strong></p>
<p><strong>AlertDialog alert = miaAlert.create();</strong></p>
<p><strong>alert.show();</strong></p>
<p>Per quanto riguarda la prime tre righe di codice non è necessario spiegare niente in quanto sono identiche a quelle mostrate nel capitolo precedente. Andando avanti con l&#8217;analisi del codice troviamo l&#8217;invocazione del metodo <em>setCanceble(false)</em> che ha l&#8217;effetto di disabilitare il tasto <em>back</em> del telefono e dunque l&#8217;utente dovrà necessariamente cliccare su uno dei due bottoni per chiudere l&#8217;AlertDialog.</p>
<p>Detto questo passiamo alla creazione dei bottoni veri e propri. Il primo bottone viene creato con il metodo <em>setPositiveButton</em> il quale prende in ingresso una stringa che verrà mostrata a schermo come contenuto del bottone e un listener. Come possiamo vedere il listener viene dichiarato come nuova istanza di <em>DialogInterface.OnClickListener</em> e non come nuova istanza di <em>View.OnClickListener</em>. Quest&#8217;ultimo infatti può essere applicato solamente ad elementi che eriditano la classe <em>View</em> e dato che le AlertDialog non ereditano questa classe, ma fanno parte del package <em>android.app</em>, è necessario utilizzare un listener di tipo <em>DialogInterface</em>.</p>
<p>All&#8217;atto pratico questa differenza non è sostanziale, infatti, anche in questo caso, sarà necessario ridefinire il metodo <em>OnClick</em> ed inserirvi il codice relativo al comportamento che vogliamo dare ai due bottoni. Come possiamo vedere il metodo <em>OnClick</em> prende in ingresso due parametri: il primo è un oggetto di tipo AlertDialog (che ci indica quale dialog ha generato l&#8217;attivazione del listener) e poi un id che identifica il bottone premuto. All&#8217;interno del metodo <em>OnClick</em> semplicemente andiamo a cambiare il testo relativo alla TextView <em>tv</em>.</p>
<p>La struttura del metodo <em>OnClick</em> ci suggerisce una versione ottimizzata del nostro listener. Infatti sapendo quale AlertDialog ha attivato il listener e quale bottone all&#8217;interno della alert è stata cliccato sarà possibile creare un un&#8217;unico listener per gestire più AlertDialog ed i relativi bottoni. Ciò si realizza semplicemente eseguendo un primo <em>switch</em> sull&#8217;attributo Dialog (andiamo ad identificare quale AlertDialog ha attivato il listener) ed in ogni <em>case </em>relativo alle AlertDialog inserire all&#8217;interno un altro <em>switch</em> per capire quale bottone, relativo alla AlertDialog presa in esame, è stato cliccato.</p>
<p>Si lascia per esercizio al lettore questa nuova implementazione del listener che sostanzialmente è molto simile a quella vista nei capitoli precedenti di questa guida</p>

<p><a href="http://feedads.g.doubleclick.net/~a/gDfUvISAcZj1dmcQC3OuGnOVKpo/0/da"><img src="http://feedads.g.doubleclick.net/~a/gDfUvISAcZj1dmcQC3OuGnOVKpo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gDfUvISAcZj1dmcQC3OuGnOVKpo/1/da"><img src="http://feedads.g.doubleclick.net/~a/gDfUvISAcZj1dmcQC3OuGnOVKpo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/FZKYc5_vyg0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/android-aggiungere-bottoni-ad-un-alertdialog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/android-aggiungere-bottoni-ad-un-alertdialog/</feedburner:origLink></item>
		<item>
		<title>Android: creare un AlertDialog</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/_QIMZrMCPv4/</link>
		<comments>http://www.danieleserio.it/android-creare-un-alertdialog/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:37:37 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2823</guid>
		<description><![CDATA[Altro strumento che, comunemente, viene utilizzato all&#8217;interno di molte applicazione è l&#8217;AlertDialog. Questo elemento viene utilizzato per mostrare un messaggio [...]]]></description>
			<content:encoded><![CDATA[<p>Altro strumento che, comunemente, viene utilizzato all&#8217;interno di molte applicazione è l&#8217;<strong>AlertDialog</strong>. Questo elemento viene utilizzato per mostrare un messaggio informativo all&#8217;utente, tipicamente un errore, un comportamento non desiderato oppure una richiesta di conferma da parte dell&#8217;utente per una qualche operazione (è dunque in grado di ricevere e gestire degli input da parte dell&#8217;utente). Per intenderci è quella finestra pop-up che appare, con una piccola animazione, sostituendo l&#8217;activity che in quel momento era visualizzato a schermo.<span id="more-2823"></span></p>
<p>Per esempio un&#8217;applicazione che richiede una connessione ad Internet per compiere alcune operazioni, potrebbe mostrare un&#8217;AlertDialog all&#8217;utente nel caso in cui il dispositivo non si riesca a collegare ad una rete Wi-Fi.</p>
<p>Bisogna precisare che l&#8217;AlertDialog, una volta mostrata a schermo, renderà l&#8217;activity che l&#8217;ha generata priva di interazione con l&#8217;utente. Si potrà nuovamente interagire con l&#8217;activity solo ed esclusivamente quando si deciderà di chiudere l&#8217;AlertDialog.</p>
<p>Vediamo adesso come costruire una AlertDialog personalizzata nel titolo e nel messaggio ed avente due bottoni ai quali verrà associato un listener che sarà in grado di capire quali dei due bottoni è stato cliccato.</p>
<p>Per prima cosa vediamo il codice relativo alla creazione di una ALertDialog. Per far ciò possiamo tranquillamente posizionarci in un file <em>.java</em> (se utilizziamo il vecchio progetto posizioniamoci nel file HelloWorld.java) e come prima cosa importiamo i seguenti pacchetti:</p>
<p><strong>import android.app.AlertDialog;</strong></p>
<p><strong>import android.content.DialogInterface;</strong></p>
<p>&nbsp;</p>
<p>Il primo pacchetto importerà la classe relativa all&#8217;AlertDialog ed il secondo pacchetto importerà gli strumenti necessari per poter applicare un listener ai bottoni che aggiungeremo alla AlertDialog.</p>
<p>Importati gli strumenti necessari inseriamo il seguente codice all&#8217;interno del metodo<em>OnCreate</em> ed ovviamente dopo l&#8217;invocazione del <em>setContentView</em>:</p>
<p><strong>AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);</strong></p>
<p><strong>miaAlert.setTitle(&#8220;AlertDialog di MrWebMaster&#8221;);</strong></p>
<p><strong>miaAlert.setMessage(&#8220;Questa è la mia prima AlertDialog&#8221;);</strong></p>
<p><strong>AlertDialog alert = miaAlert.create();</strong></p>
<p><strong>alert.show();</strong></p>
<p>Analizzando il codice vediamo che la creazione dell&#8217;intera struttura della alert viene affidata all&#8217;oggetto <em>AlertDialog.Builder</em> che, attraverso l&#8217;invocazione dei metodo <em>setTitle</em> e <em>setMessage</em> imposta il titolo ed il messaggio della AlertDialog da mostrare all&#8217;utente. Da notare che al costruttore dell&#8217;oggetto <em>AlertDialog.Builder</em> viene passato come contesto <em>this </em>ovvero l&#8217;activity con cui stiamo lavorando in questo momento.</p>
<p>Strutturata l&#8217;AlertDialog viene creato un oggetto <em>AlertDialog</em> inizializzandolo con le caratteristiche impostate dal builder attraverso il metodo <em>onCreate</em>. Fino a questo momento abbiamo solamente instanziato l&#8217;oggetto <em>AlertDialog</em> e se lanciassimo l&#8217;applicazione non la vedremo apparire sullo schermo. Per ovviare a ciò si invoca il metodo <em>show</em> che appunto permette la visualizzazione a schermo dell&#8217;AlertDialog.</p>
<p>Una pratica molto comune è quella di aggiungere, prima del titolo dell&#8217;<em>AlertDialog </em>un&#8217;immagine esplicativa che dovrebbe raffigurare il significato del messaggio. Per intenderci se il messaggio mostrato all&#8217;utente è un messaggio d&#8217;errore sarebbe opportuno inserire un&#8217;immagine che per esempio rappresenti un punto esclamativo su sfondo rosso oppure, se il messaggio è un messaggio di warning associare la classica immagine di un punto esclamativo inscritto in un triangolo giallo.</p>
<p>Per mostrare come compiere questa ulteriore personalizzazione utilizzeremo l&#8217;immagine<em>icon.png</em> (quella che identifica la nostra applicazione nel menù) localizzata dentro la cartella <em>res/drawable</em>.</p>
<p>E&#8217; sufficiente inserire nel builder questa ulteriore riga di codice:</p>
<p><strong>miaAlert.setIcon(R.drawable.icon);</strong><strong></strong></p>
<p>Nel prossimo capitolo andremo ad aggiungere i bottoni alla AlertDialog e assoceremo i listener</p>

<p><a href="http://feedads.g.doubleclick.net/~a/plgskWfS7-2h99DeuGFtCobwnRU/0/da"><img src="http://feedads.g.doubleclick.net/~a/plgskWfS7-2h99DeuGFtCobwnRU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/plgskWfS7-2h99DeuGFtCobwnRU/1/da"><img src="http://feedads.g.doubleclick.net/~a/plgskWfS7-2h99DeuGFtCobwnRU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/_QIMZrMCPv4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/android-creare-un-alertdialog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/android-creare-un-alertdialog/</feedburner:origLink></item>
		<item>
		<title>Android: cosa sono i Toast</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/UeGT9q9KUzA/</link>
		<comments>http://www.danieleserio.it/android-cosa-sono-i-toast/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:36:19 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2821</guid>
		<description><![CDATA[Andiamo in questo capitolo a trattare un ultimo widget: ovvero il Toast. Questo oggetto è molto utilizzato in molte applicazioni per [...]]]></description>
			<content:encoded><![CDATA[<p>Andiamo in questo capitolo a trattare un ultimo widget: ovvero il <strong>Toast</strong>. Questo oggetto è molto utilizzato in molte applicazioni per mostrare all&#8217;utente un messaggio di durata temporanea paragonabile ad una notifica.</p>
<p>Un esempio di utilizzo di questo widget è quello per notificare all&#8217;utente un messaggio del tipo &#8220;salvataggio effettuato&#8221; oppure &#8220;operazione eseguita&#8221; in seguito a qualche operazione compiuta dall&#8217;utente. La caratteristica di questo widget è quello di essere estremamente semplice in quanto ha la possibilità di mostrare a video solamente un messaggio o un&#8217;immagine senza però poter interagire con l&#8217;utente.<span id="more-2821"></span></p>
<p>Vediamo adesso il codice necessario per mostrare a video un toast con un testo da noi personalizzato. Per far ciò possiamo riprendere un vecchio progetto relativo ai bottoni e i listener oppure (operazione consigliata per prendere familiarità con la programmazione) riscrivere il codice relativo ad un bottone e all&#8217;associazione ad esso di un <em>OnClickListener</em>. Per poter utilizzare i Toast è necessario importare nel nostro progetto la classe:</p>
<p><strong>android.widget.Toast</strong><strong></strong></p>
<p>Posizioniamoci adesso all&#8217;interno del metodo <em>OnClick</em> ed inseriamo queste due linee di codice:</p>
<p><strong>Toast mioToast = Toast.makeText(HelloWorld.this, </strong></p>
<p><strong>&#8220;Questo è un Toast creato da MrWebMaster&#8221;, </strong></p>
<p><strong>Toast.LENGTH_LONG);</strong></p>
<p><strong>mioToast.show();</strong></p>
<p>Andiamo ad analizzare con attenzione il metodo <em>makeText</em> ed il prototipo del metodo che è il seguente:</p>
<p><strong>makeText(Context context, CharSequence text, int duration)</strong></p>
<p><strong> </strong></p>
<p>Come primo parametro, il metodo richiede il contesto nel quale applicare il toast. Dato che il codice è inserito all&#8217;interno del listener non possiamo passare come contesto <em>this</em> in quanto passeremo come argomento il listener stesso al quale non è applicabile un toast. E&#8217; necessario passare come contesto l&#8217;activity principale per poter mostrare il toast a video e dunque inseriremo come parametro <em>HelloWorld.this</em>.<br /> Come secondo parametro, banalmente, viene passato un testo che vogliamo mostrare all&#8217;utente.<br /> Infine come ultimo parametro, viene passata una costante, nel nostro caso <em>LENGHT_LONG</em>, che serve a specificare la durata di visibilità del Toast. Purtroppo non è possibile specificare, in questo parametro, i secondi precisi duranti i quali il Toast deve essere visibile, ma bensì è possibile scegliere solamente tra la costante vista prima e la costante <em>LENGHT_SHORT</em> che setta una durata della visibilità del Toast minore rispetto alla prima costante.</p>
<p>Ricapitolando, l&#8217;effetto della prima porzione di codice è quello di istanziare un oggetto di tipo Toast con le caratteristiche volute; ancora, però, il Toast non è visibile. Per far ciò è necessario invocare il metodo <em>show()</em> sul Toast stesso.</p>
<p>Come possiamo vedere, nel primo esempio mostrato, non abbiamo indicato alla nostra activity dove posizionare il nostro Toast. Per utilizzare il metodo per settare la posizione del toast è necessario prima importare la seguente classe:</p>
<p><strong>android.view.Gravity</strong><strong></strong></p>
<p>Per posizionare il Toast, per esempio, al centro della schermata basta inserire questa linea di codice prima dell&#8217;invocazione del metodo <em>show()</em>:</p>
<p><strong>setGravity(Gravity.CENTER, 0, 0);</strong><strong></strong></p>
<p>Come possiamo vedere passiamo come primo argomento il centro dello schermo e poi viene indicato lo scostamento sull&#8217;asse x e sull&#8217;asse y dal punto precedentemente indicato.</p>
<div>
<p><span style="text-decoration: underline;"><span style="font-size: medium;"><strong>Usare un&#8217;immagine al posto del testo</strong></span></span></p>
</div>
<p>E&#8217; possibile, come già detto, sostituire il testo del toast con un&#8217;immagine da mostrare all&#8217;utente. In questo caso, ovviamente, non sarà possibile utilizzare il metodo <em>makeText</em>, ma dovremo utilizzare il costruttore <strong>Toast(Context context)</strong> passando solo il contesto (quello relativo all&#8217;activity). In seguito dovremo utilizzare il metodo <em>setView()</em> per associare l&#8217;immagine al nostro Toast.<br /> Di seguito il codice completo per mostrare un’immagine mediante Toast:</p>
<p><strong>ImageView imageForToast = new ImageView(HelloWorld.this);</strong></p>
<p><strong>imageForToast.setImageResource(R.drawable.icon);</strong></p>
<p><strong> </strong></p>
<p><strong>Toast mioToast = new Toast(HelloWorld.this);</strong></p>
<p><strong>mioToast.setView(imageForToast);</strong></p>
<p><strong> </strong></p>
<p><strong>mioToast.show();</strong><strong></strong></p>

<p><a href="http://feedads.g.doubleclick.net/~a/xtuS2qGejld70iD9wt7lVwvhcso/0/da"><img src="http://feedads.g.doubleclick.net/~a/xtuS2qGejld70iD9wt7lVwvhcso/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xtuS2qGejld70iD9wt7lVwvhcso/1/da"><img src="http://feedads.g.doubleclick.net/~a/xtuS2qGejld70iD9wt7lVwvhcso/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/UeGT9q9KUzA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/android-cosa-sono-i-toast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/android-cosa-sono-i-toast/</feedburner:origLink></item>
		<item>
		<title>Android: aggiungere una immagine al progetto – ImageView</title>
		<link>http://feedproxy.google.com/~r/danieleserio/LnTo/~3/nQiN41moYfk/</link>
		<comments>http://www.danieleserio.it/android-aggiungere-una-immagine-al-progetto-imageview/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:34:54 +0000</pubDate>
		<dc:creator>Daniele Serio</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.danieleserio.it/?p=2819</guid>
		<description><![CDATA[L&#8217;ImageView altro non è che l&#8217;oggetto che permette al programmatore di mostrare a schermo un&#8217;immagine. Prima di fare un esempio [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;ImageView altro non è che l&#8217;oggetto che permette al programmatore di mostrare a schermo un&#8217;immagine. Prima di fare un esempio pratico relativo alla visualizzazione di una ImageView è necessario capire dove inserire la nostra immagine e capire la struttura della cartella <em>res</em> del nostro progetto.<span id="more-2819"></span></p>
<p>Andando ad esplorare proprio questa cartella troveremo una sottocartella <em>layout</em>, che abbiamo utilizzato abbondantemente fino a questo momento, ed altre tre sotto cartelle identificate dai seguenti nomi:</p>
<ul>
<li><em>drawable-hdpi</em></li>
<li><em>drawable-mdpi</em></li>
<li><em>drawable-ldpi</em></li>
</ul>
<p>Le sottocartelle sopra elencate sono quelle che dovranno contenere le immagini che desideriamo inserire all&#8217;interno della nostra applicazione.</p>
<p>Ma quale è il significato di queste cartelle? Dunque dato che Android è un sistema operativo mobile che è installato su dispositivi diversi aventi risoluzione diversa, per avere una sorta di ottimizzazione dell&#8217;immagine è opportuno creare tre versioni delle immagini a grandezze differenti. Queste tre versioni delle immagini dovranno essere inserite in ordine di grandezza dalla più grande alla più piccola nelle cartelle viste sopra.</p>
<p>Ovviamente per visualizzare un&#8217;immagine a schermo è sufficiente che ci sia almeno una versione dell&#8217;immagine all&#8217;interno di una delle tre cartelle. Nel caso in cui volessimo mostrare un&#8217;immagine ottimizzata per schermi a bassa risoluzione su schermi ad alta risoluzione dovremo necessariamente ingrandire l&#8217;immagine causando un inevitabile sfuocamento dell&#8217;immagine stessa.</p>
<p>Detto ciò forniamo un esempio pratico. Prendiamo un&#8217;immagine di esempio e inseriamola nelle cartelle viste sopra (anche evitando di creare tre versioni dell&#8217;immagine). Fatto ciò è necessario aprire il file <em>main.xml</em> ed inseriamo il codice relativo alla dichiarazione della nostra ImageView che abbiamo chiamato <em>Image</em>:</p>
<p><strong>&lt;ImageView android:id=&#8221;@+id/Image&#8221; </strong></p>
<p><strong>android:layout_width=&#8221;wrap_content&#8221; </strong></p>
<p><strong>android:layout_height=&#8221;wrap_content&#8221;&gt;</strong></p>
<p><strong>&lt;/ImageView&gt;</strong></p>
<p>Apriamo adesso il file <em>.java</em> ed importiamo l&#8217;oggetto ImageView</p>
<p><strong>android.widget.ImageView</strong></p>
<p>dichiariamo un oggetto di tipo ImageView</p>
<p><strong>private ImageView miaImmagine;</strong></p>
<p>ed infine inseriamo il seguente codice:</p>
<p><strong>miaImmagine = (ImageView) findViewById(R.id.Image);</strong></p>
<p><strong>miaImmagine.setImageResource(R.drawable.ImmagineEsempio);</strong></p>
<p>Come possiamo vedere il codice relativo alla visualizzazione di un&#8217;immagine è molto semplice. Nella prima riga associamo l&#8217;elemento dichiarato nell&#8217;XML con quello dichiarato nel codice e inseguito impostiamo il valore dell&#8217;immagine con il metodo <em>setImageResource</em>. Passiamo a questo metodo il codice relativo alla nostra immagine che troviamo nel file <em>R</em> sella sotto-classe <em>drawable</em>.</p>
<p>Come è intuibile capire, quando inseriamo una qualsiasi immagine all&#8217;interno di una delle cartelle <em>drawable-&#8230;</em> automaticamente verrà creata una costante relativa all&#8217;immagine nel file <em>R</em> nella sotto-classe <em>drawable</em>. Il nome usato nell&#8217;esempio, <em>ImmagineEsempio</em>, è il nome relativo al file che identifica l&#8217;immagine. Come possiamo vedere è sufficiente inserire solamente il nome del file omettendo l&#8217;estensione.</p>
<p>Una particolarità di android è quella di effettuare un resize automatico dell&#8217;immagine di dimensioni superiori alla risoluzione dello schermo. Per vedere questo comportamento è sufficiente mostrare a schermo un immagine ad alta risoluzione. Quest&#8217;ultima verrà ridimensionata, in maniera del tutto automatica, e adattata allo schermo del simulatore o del dispositivo senza problemi. Il resize di un&#8217;immagine da più grande a più piccola non comporta nessuna perdita di qualità (si aumentano però le operazioni che vengono eseguite dal sistema operativo quando viene lanciata l&#8217;applicazione) viceversa, come abbiamo detto precedentemente, si avrebbe una perdita di qualità proporzionale all&#8217;ingrandimento.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/wQZ8Uykci_X00PQ-lfluH3Ht5oY/0/da"><img src="http://feedads.g.doubleclick.net/~a/wQZ8Uykci_X00PQ-lfluH3Ht5oY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/wQZ8Uykci_X00PQ-lfluH3Ht5oY/1/da"><img src="http://feedads.g.doubleclick.net/~a/wQZ8Uykci_X00PQ-lfluH3Ht5oY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/danieleserio/LnTo/~4/nQiN41moYfk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.danieleserio.it/android-aggiungere-una-immagine-al-progetto-imageview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.danieleserio.it/android-aggiungere-una-immagine-al-progetto-imageview/</feedburner:origLink></item>
	</channel>
</rss>

