<?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>Tutos Android</title>
	
	<link>http://www.tutos-android.com</link>
	<description>Apprendre à développer sous Android c'est facile</description>
	<lastBuildDate>Wed, 03 Apr 2013 10:09:59 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Tutos_Android" /><feedburner:info uri="tutos_android" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Introduction au NDK sous Android</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/awsuIy8U_yc/introduction-ndk-android</link>
		<comments>http://www.tutos-android.com/introduction-ndk-android#comments</comments>
		<pubDate>Tue, 12 Mar 2013 14:43:27 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[#include android]]></category>
		<category><![CDATA[$(call my-dir) android]]></category>
		<category><![CDATA[BUILD_EXECUTABLE android]]></category>
		<category><![CDATA[BUILD_PACKAGE android]]></category>
		<category><![CDATA[BUILD_SHARED_LIBRARY android]]></category>
		<category><![CDATA[include $(BUILD_SHARED_LIBRARY) android]]></category>
		<category><![CDATA[include $(CLEAR_VARS) android]]></category>
		<category><![CDATA[installation ndk]]></category>
		<category><![CDATA[installation ndk android]]></category>
		<category><![CDATA[introduction ndk android]]></category>
		<category><![CDATA[jni android]]></category>
		<category><![CDATA[jni.h android]]></category>
		<category><![CDATA[loadLibreary android]]></category>
		<category><![CDATA[loadLibreary android jni]]></category>
		<category><![CDATA[loadLibreary jni]]></category>
		<category><![CDATA[loadLibreary ndk]]></category>
		<category><![CDATA[LOCAL_MODULE android]]></category>
		<category><![CDATA[LOCAL_MODULE_TAGS android]]></category>
		<category><![CDATA[LOCAL_PATH android]]></category>
		<category><![CDATA[LOCAL_SHARED_LIBRARIES android]]></category>
		<category><![CDATA[LOCAL_SRC_FILES android]]></category>
		<category><![CDATA[native android]]></category>
		<category><![CDATA[ndk android]]></category>
		<category><![CDATA[ndk android jni]]></category>
		<category><![CDATA[ndk-build android]]></category>
		<category><![CDATA[NewStringUTF android]]></category>
		<category><![CDATA[tuto ndk android]]></category>
		<category><![CDATA[tutoriel ndk android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=1319</guid>
		<description><![CDATA[Qu&#8217;est ce que le NDK Le NDK (Native Developpement Kit &#8211; Kit de développement natif) est un outil permettant d&#8217;implémenter des parties natives (en C ou C++) pour vos application. Cela vous permet par exemple, de créer du code commun (bibliothèque) entre plusieurs applications ou entre des applications Android &#038; IOS par exemple. Pré-requis Pour [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>Qu&#8217;est ce que le NDK</strong></h2>
<p>Le NDK (Native Developpement Kit &#8211; Kit de développement natif) est un outil permettant d&#8217;implémenter des parties natives (en C ou C++) pour vos application. Cela vous permet par exemple, de créer du code commun (bibliothèque) entre plusieurs applications ou entre des applications Android &#038; IOS par exemple.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/Android-NDK.jpg"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/Android-NDK.jpg" alt="" title="Android-NDK" width="527" height="300" class="aligncenter size-full wp-image-1336" /></a></p>
<p><span id="more-1319"></span></p>
<h2><strong>Pré-requis</strong></h2>
<ul>
<li>Pour commencer, téléchargez le NDK correspondant à votre OS (le tutoriel ce déroule sous MacOSX) sur le site suivant : <a href="http://developer.android.com/tools/sdk/ndk/index.html">http://developer.android.com/tools/sdk/ndk/index.html</a></li>
<li>Décompressez le contenu de votre NDK à l&#8217;emplacement de </li>
<li>Si vous êtes sous Windows, il faut absolument installer une solution tel que <a href="http://cygwin.com/install.html">Cygwin</a>, pour faciliter l&#8217;utilisation du NDK et la compilation</li>
<li>L&#8217;utilisation du SDK nécessite aussi l&#8217;installation de &#8220;make&#8221; afin de compiler les sources natives</li>
</ul>
<h2><strong>Création d&#8217;un projet</strong></h2>
<p>Pour commencer, créez un projet Android (&#8220;HelloNDK&#8221; dans l&#8217;exemple) en suivant les étapes çi-dessous : </p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/screen.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/screen.png" alt="" title="screen" width="625" height="524" class="aligncenter size-full wp-image-1344" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/screen2.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/screen2.png" alt="" title="screen2" width="621" height="528" class="aligncenter size-full wp-image-1329" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/screen3.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/screen3.png" alt="" title="screen3" width="622" height="526" class="aligncenter size-full wp-image-1330" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/screen4.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/screen4.png" alt="" title="screen4" width="622" height="528" class="aligncenter size-full wp-image-1331" /></a></p>
<p>Maintenant, créez un dossier <strong>&#8220;jni&#8221;</strong> (Java Native Interface) à la racine de votre projet. Ce dossier contiendra tout d&#8217;abord deux fichiers : </p>
<ul>
<li>Un fichier <strong>Android.mk</strong> : Ce fichier servira à décrire la structure de votre projet utilisé par le NDK pour la compilation de vos fichiers natifs</li>
<li>Un fichier de code natif (ici hello.c) : Contiendra votre code natif</li>
</ul>
<h2><strong>Android Makefile</strong></h2>
<p>L&#8217;un des fichiers important de votre projet est votre Android Makefile <strong>&#8216;Android.mk</strong>&#8216;. Comme expliqué précipitamment, ce fichier sert défini les éléments nécessaires à la compilation de vos fichiers natifs. Il peux contenir les éléments suivants : </p>
<ul>
<li>Le nom de votre module : Option <strong>LOCAL_MODULE</strong></li>
<li>Les fichiers sources de votre application : Option <strong>LOCAL_SRC_FILSE</strong></li>
<li>Les bibliothéques utilisées par votre code natif : Option <strong>LOCAL_SHARED_LIBRARIES</strong></li>
<li>Des variables utiles pour votre compilation, ces variables doivent être vider à chaque compilation, donc utilisez <strong>include $(CLEAR-VARS)</strong></li>
<li>Des tags : Options <strong>LOCAL_MODULE_TAGS</strong></li>
<li>Le type de build souhaité : <strong>BUILD_PACKAGE</strong>, <strong>BUILD_EXECUTABLE</strong>, <strong>BUILD_SHARED_LIBRARY </strong>&#8230; </li>
</ul>
<p>Voici l&#8217;exemple correspondant à notre projet</p>
<pre class="brush: xml; title: ; notranslate">
LOCAL_PATH := $(call my-dir)
#Vider les variables utilisées
include $(CLEAR_VARS)
#Nom du module (donc de la bibliothéque générée)
LOCAL_MODULE := hellondk
#Fichiers sources utilisées
LOCAL_SRC_FILES := hello.c
#Type de fichier en sortie (ici bibliothéque partagée)
include $(BUILD_SHARED_LIBRARY)
</pre>
<h2><strong>hello.c</strong></h2>
<p>Ce fichier contient votre code natif, dans notre cas, ce code servira uniquement à afficher le message &#8220;Hello NDK <img src='http://www.tutos-android.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;string.h&gt;
#include &lt;jni.h&gt;

jstring Java_com_tuto_hellondk_MainActivity_invokeNativeFunction(JNIEnv* env, jobject thiz)
{
	return (*env)-&gt;NewStringUTF(env, &quot;Hello NDK <img src='http://www.tutos-android.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &quot;);
}

</pre>
<p>Le nom de votre méthode doit être se composer des parties suivantes :</p>
<ul>
<li>Commence par <strong>Java</strong></li>
<li>puis votre nom de package ou vous remplacez les points par des _</li>
<li>puis le nom de l&#8217;activité cible (ici <strong>MainActivity</strong>)</li>
<li>puis le nom de votre fonction (ici <strong>invokeNativeFunction</strong>)</li>
</ul>
<h2><strong>Compilation</strong></h2>
<p>Maintenant, nous allons compiler notre projet NDK pour créer une bibliothèque (.so = bibliothèque dynamique) afin de l&#8217;intégrer dans notre classe Java.</p>
<p>Pour compiler, il suffit de vous déplacer dans le dossier de votre projet et exécutez la commande <strong>&#8220;ndk-build&#8221;</strong></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/screen6.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/screen6.png" alt="" title="screen6" width="454" height="74" class="aligncenter size-full wp-image-1339" /></a></p>
<p>La bibliothéque .so est généré dans le dossier <strong>libs/armeabi</strong> de votre projet</p>
<h2><strong>Intégration JAVA</strong></h2>
<p>Maintenant, nous allons intégrer la bibliothèque généré dans l&#8217;activité de notre projet (<strong>MainActivity</strong>) à l&#8217;aide de la méthode <strong>loadLibreary</strong>. Il faut spécifier le nom de la bibliothèque à charger.</p>
<pre class="brush: java; title: ; notranslate">
static {
	System.loadLibrary(&quot;hellondk&quot;);
}
</pre>
<p>Puis la déclaration de la méthode <strong>invoteNativeFunction()</strong> disponible dans la bibliothèque chargé précédemment </p>
<pre class="brush: java; title: ; notranslate">
private native String invokeNativeFunction();
</pre>
<p>Puis utilisez la méthode pour récupérer la chaîne de caractère renvoyer par la méthode native</p>
<pre class="brush: java; title: ; notranslate">
String hello = invokeNativeFunction();
</pre>
<p>Ce qui donnera pour votre activité </p>
<pre class="brush: java; title: ; notranslate">
package com.tuto.hellondk;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	static {
		System.loadLibrary(&quot;hellondk&quot;);
	}
	
	private native String invokeNativeFunction();
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView helloTextView = (TextView) findViewById(R.id.hello);
        String hello = invokeNativeFunction();
        helloTextView.setText(hello);
    }
    
}
</pre>
<h2><strong>Résultat</strong></h2>
<p>Maintenant, exécutez votre application sur un appareil ou un émulateur. Ce qui donnera : </p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2013-03-12-153847.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2013-03-12-153847-180x300.png" alt="" title="device-2013-03-12-153847" width="180" height="300" class="aligncenter size-medium wp-image-1340" /></a></p>
<p>Vous pouvez télécharger, le projet d&#8217;exemple, à l&#8217;adresse <a href="http://www.tutos-android.com/wp-content/uploads/2013/03/HelloNDK.zip">suivante</a></p>
<p>Si vous voulez, aller plus loin, dans l&#8217;utilisation du NDK (en attendant d&#8217;autres tuto <img src='http://www.tutos-android.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), voici le lien vers une conférence du PAUG sur le NDK (slide &#038; vidéo) : <a href="http://www.paug.fr/conference-paug/compte-rendu-conference-paug/slides-et-video-conference-android-ndk-1er-mars-2013-par-sylvain-ratabouil/">http://www.paug.fr/conference-paug/compte-rendu-conference-paug/slides-et-video-conference-android-ndk-1er-mars-2013-par-sylvain-ratabouil/</a></p>
<p>à bientôt <img src='http://www.tutos-android.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/introduction-ndk-android/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/introduction-ndk-android</feedburner:origLink></item>
		<item>
		<title>Introduction à Google Map V2</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/xdqbVrdhfe8/introduction-a-google-map-v2</link>
		<comments>http://www.tutos-android.com/introduction-a-google-map-v2#comments</comments>
		<pubDate>Fri, 01 Mar 2013 13:12:58 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ACCESS_COARSE_LOCATION android]]></category>
		<category><![CDATA[ACCESS_FINE_LOCATION android]]></category>
		<category><![CDATA[Gmap ANdroid]]></category>
		<category><![CDATA[Gmap v2 android]]></category>
		<category><![CDATA[Google Map Android]]></category>
		<category><![CDATA[Google Map V2]]></category>
		<category><![CDATA[Google Map V2 Android]]></category>
		<category><![CDATA[Google Maps Android API V2]]></category>
		<category><![CDATA[Google Play Services]]></category>
		<category><![CDATA[key google map v2]]></category>
		<category><![CDATA[MapActivity Android]]></category>
		<category><![CDATA[MapFragment android]]></category>
		<category><![CDATA[MAPS_RECEIVE android]]></category>
		<category><![CDATA[meta-data android]]></category>
		<category><![CDATA[SHA-1 Google map v2]]></category>
		<category><![CDATA[uses-feature android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=1269</guid>
		<description><![CDATA[Bonjour/Bonsoir à tous, après une petite absence (je m&#8217;excuse au passage pour cette absence). C&#8217;est avec grand plaisir que je publie ce nouveau tutoriel sur la nouvelle version de Google Map, la maniéré de l&#8217;intégrer et l&#8217;utiliser dans une application Android. Pré-requis Il faut tout d&#8217;abord installer et configurer &#8220;Google Play Services&#8221; disponible dans le [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour/Bonsoir à tous, après une petite absence (je m&#8217;excuse au passage pour cette absence). C&#8217;est avec grand plaisir que je publie ce nouveau tutoriel sur la nouvelle version de Google Map, la maniéré de l&#8217;intégrer et l&#8217;utiliser dans une application Android.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/banner.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/banner.png" alt="" title="banner" width="500" height="158" class="aligncenter size-full wp-image-1306" /></a></p>
<p><span id="more-1269"></span></p>
<h2><strong>Pré-requis</strong></h2>
<ul>
<li>Il faut tout d&#8217;abord installer et configurer <strong>&#8220;Google Play Services&#8221;</strong> disponible dans le SDK Manager.
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064451.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064451.png" alt="" title="device-2012-07-20-1206445" width="500" height="187" class="aligncenter size-full wp-image-1274" /></a>
</li>
<li>Puis, vous devez récupérer une clé API à l&#8217;adresse suivante &#8220;<a href="https://code.google.com/apis/console/">Google APIs Console</a>&#8220;</li>
<li>Créez un projet à l&#8217;aide du bouton <strong>Create</strong>, puis dans la partie <strong>&#8220;Services&#8221;</strong> (menu de gauche), activez le service <strong>Google Map Android API V2</strong>.
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064472.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064472.png" alt="" title="device-2012-07-20-1206447" width="500" height="152" class="aligncenter size-full wp-image-1301" /></a>
</li>
<li>Cliquez sur le bouton &#8220;API Access&#8221; situé sur la barre de navigation (à gauche de l&#8217;écran)
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064481.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-12064481.png" alt="" title="device-2012-07-20-1206448" width="500" height="331" class="aligncenter size-full wp-image-1285" /></a></p>
</li>
<li>Récupérez la clé SHA-1 correspondante à la clé &#8220;keystore&#8221; utilisée
<li>Pour trouver l&#8217;emplacement du keystore utilisé, regardez les préférences d&#8217;Eclipse :
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206449.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206449.png" alt="" title="device-2012-07-20-1206449" width="500" height="281" class="aligncenter size-full wp-image-1290" /></a>
</li>
<li>Récupérez votre clé SHA-1 à l&#8217;aide de la commande suivante :
<p><strong>keytool.exe -v -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android</strong></p>
</li>
<li>Créez un projet Android et notez votre nom de package, ici : <em><strong>com.tutos.android.gmapv2</strong></em>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-120644.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-120644.png" alt="" title="device-2012-07-20-120644" width="500" height="424" class="aligncenter size-full wp-image-1292" /></a>
</li>
<li>Cliquez sur bouton <strong>&#8220;Create New Android Key&#8221;</strong> et copiez collez votre empreinte SHA-1 ainsi que votre nom de package :<br />
<a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206450.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206450.png" alt="" title="device-2012-07-20-1206450" width="500" height="357" class="aligncenter size-full wp-image-1293" /></a>
</li>
<li>Puis cliquez sur le bouton <strong>&#8220;Create&#8221; et vous obtiendrez ainsi votre API Key (Gardez là de côté)</li>
</ul>
<h2><strong>Mise à jour du projet</strong></h2>
<p>Dans l&#8217;AndroidManifest de votre projet, rajoutez les lignes suivantes (dans la balise application)</p>
<pre class="brush: xml; title: ; notranslate">
   &lt;meta-data
            android:name=&quot;com.google.android.maps.v2.API_KEY&quot;
            android:value=&quot;your_api_key&quot; /&gt;
</pre>
<p>Ainsi que les lignes suivantes afin de déclarer une permission nécessaire à l&#8217;utilisation de GMap (remplacer com.tutos.android.gmapv2 par votre nom de package)</p>
<pre class="brush: xml; title: ; notranslate">
&lt;permission
        android:name=&quot;com.tutos.android.gmapv2.permission.MAPS_RECEIVE&quot;
        android:protectionLevel=&quot;signature&quot; /&gt;

    &lt;uses-permission android:name=&quot;com.tutos.android.gmapv2.permission.MAPS_RECEIVE&quot; /&gt;
</pre>
<p>Ainsi que les permissions suivantes : </p>
<pre class="brush: xml; title: ; notranslate">
    &lt;!-- Permission pour utiliser la connexion internet --&gt;
    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
    &lt;!-- Permission permettant de vérifier l'état de la connexion --&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
    &lt;!-- Permission pour stocker des données en cache de la map --&gt;
    &lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;
    &lt;uses-permission android:name=&quot;com.google.android.providers.gsf.permission.READ_GSERVICES&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_COARSE_LOCATION&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&gt;
</pre>
<p>Afin de pouvoir utiliser GMap V2 sur un appareil, celui ci nécessite la présence <strong>d&#8217;OpenGL ES Version 2</strong>. Les lignes suivantes permettent de rendre l&#8217;application indisponible aux appareils qui ne possède pas cette version d&#8217;OpenGL</p>
<pre class="brush: xml; title: ; notranslate">
&lt;uses-feature
        android:glEsVersion=&quot;0x00020000&quot;
        android:required=&quot;true&quot; /&gt;
</pre>
<p>Voici à quoi ressemblera votre fichier AndroidManifest</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;com.tutos.android.gmapv2&quot;
    android:versionCode=&quot;1&quot;
    android:versionName=&quot;1.0&quot; &gt;

    &lt;uses-sdk
        android:minSdkVersion=&quot;9&quot;
        android:targetSdkVersion=&quot;17&quot; /&gt;

    &lt;permission
        android:name=&quot;com.tutos.android.gmapv2.permission.MAPS_RECEIVE&quot;
        android:protectionLevel=&quot;signature&quot; /&gt;

    &lt;uses-permission android:name=&quot;com.tutos.android.gmapv2.permission.MAPS_RECEIVE&quot; /&gt;

    &lt;!-- Permission pour utiliser la connexion internet --&gt;
    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
    &lt;!-- Permission permettant de vérifier l'état de la connexion --&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
    &lt;!-- Permission pour stocker des données en cache de la map --&gt;
    &lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;
    &lt;uses-permission android:name=&quot;com.google.android.providers.gsf.permission.READ_GSERVICES&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_COARSE_LOCATION&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&gt;

    &lt;uses-feature
        android:glEsVersion=&quot;0x00020000&quot;
        android:required=&quot;true&quot; /&gt;

    &lt;application
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@drawable/ic_launcher&quot;
        android:label=&quot;@string/app_name&quot;
        android:theme=&quot;@style/AppTheme&quot; &gt;
        &lt;meta-data
            android:name=&quot;com.google.android.maps.v2.API_KEY&quot;
            android:value=&quot;AIzaSyBUmd2bMQmcuEpHaw2lKduIdVAPoIXe9ic&quot; /&gt;

        &lt;activity
            android:name=&quot;com.tutos.android.gmapv2.MapActivity&quot;
            android:label=&quot;@string/app_name&quot; &gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;

                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;

&lt;/manifest&gt;
</pre>
<h2><strong>Intégration de la carte</strong></h2>
<p>Modifiez votre fichier <strong>main.xml</strong> afin d&#8217;intégrer une carte possédant les attributs suivants : </p>
<ul>
<li>Un Fragment représentant la carte</li>
<li>Un identifiant pour pouvoir intéragir avec la carte</li>
</ul>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;fragment xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:id=&quot;@+id/map&quot;
    android:name=&quot;com.google.android.gms.maps.MapFragment&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot; /&gt;
</pre>
<p>Ainsi que votre activité afin de spécifier la vue à charger</p>
<pre class="brush: java; title: ; notranslate">
package com.tutos.android.gmapv2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MapActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.map, menu);
		return true;
	}

}
</pre>
<p><strong>N&#8217;oubliez pas de rajouter la bibliothèque <strong>google play service<strong> à votre projet (télécharger précédemment). Elle est disponible dans votre dossier sdk.<br />
Il suffit d&#8217;importer le projet suivant dans eclipse : <strong>D:\Users\xxxxx\android-sdks\extras\google\google_play_services\libproject\google-play-services_lib</strong> puis le rajouter à votre projet GMap</strong></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206451.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2012-07-20-1206451.png" alt="" title="device-2012-07-20-1206451" width="600" height="819" class="aligncenter size-full wp-image-1298" /></a></p>
<h2><strong>Résultat</strong></h2>
<p>Maintenant vous pouvez exécuter le projet sur votre appareil. Ce qui donnera le résultat suivant : </p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2013-03-01-124031.png"><img src="http://www.tutos-android.com/wp-content/uploads/2013/03/device-2013-03-01-124031.png" alt="" title="device-2013-03-01-124031" width="500" height="833" class="aligncenter size-full wp-image-1303" /></a></p>
<p>Vous pouvez télécharger <a href="http://www.tutos-android.com/wp-content/uploads/2013/03/GmapV2.zip">ici</a> le code d&#8217;exemple de ce tuto.</p>
<p>N&#8217;hésitez pas à poser vos questions</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/introduction-a-google-map-v2/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/introduction-a-google-map-v2</feedburner:origLink></item>
		<item>
		<title>Les notifications sous Android Jelly Bean</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/D2M3diJpedU/notifications-android</link>
		<comments>http://www.tutos-android.com/notifications-android#comments</comments>
		<pubDate>Thu, 15 Nov 2012 09:28:09 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[action android notification]]></category>
		<category><![CDATA[action notification]]></category>
		<category><![CDATA[addAction android]]></category>
		<category><![CDATA[addAction notification]]></category>
		<category><![CDATA[addAction notification android]]></category>
		<category><![CDATA[ajouter une action notification]]></category>
		<category><![CDATA[ajouter une action notification android]]></category>
		<category><![CDATA[ajouter une notification android]]></category>
		<category><![CDATA[bigpicture android]]></category>
		<category><![CDATA[bigpicture notification android]]></category>
		<category><![CDATA[bigtext notification android]]></category>
		<category><![CDATA[builder android]]></category>
		<category><![CDATA[builder notification android]]></category>
		<category><![CDATA[cancel android]]></category>
		<category><![CDATA[Context.NOTIFICATION_SERVICE android]]></category>
		<category><![CDATA[créer notification android]]></category>
		<category><![CDATA[créer une notifcation android]]></category>
		<category><![CDATA[grande image notification android]]></category>
		<category><![CDATA[Intent Android]]></category>
		<category><![CDATA[notication sous android]]></category>
		<category><![CDATA[notification 4.1]]></category>
		<category><![CDATA[notification android]]></category>
		<category><![CDATA[notification android tuto]]></category>
		<category><![CDATA[notification android tutoriel]]></category>
		<category><![CDATA[notification jelly bean]]></category>
		<category><![CDATA[notification jellybean]]></category>
		<category><![CDATA[notification priorité android]]></category>
		<category><![CDATA[notification tuto android]]></category>
		<category><![CDATA[NotificationManager android]]></category>
		<category><![CDATA[notifications android]]></category>
		<category><![CDATA[notifications sous android]]></category>
		<category><![CDATA[notify android]]></category>
		<category><![CDATA[pending intent android]]></category>
		<category><![CDATA[priorité notification android]]></category>
		<category><![CDATA[PRIORITY_DEFAULT notification android]]></category>
		<category><![CDATA[PRIORITY_HIGH notification android]]></category>
		<category><![CDATA[PRIORITY_LOW notification android]]></category>
		<category><![CDATA[PRIORITY_MAX notification android]]></category>
		<category><![CDATA[PRIORITY_Min notification android]]></category>
		<category><![CDATA[setContentIntent notification]]></category>
		<category><![CDATA[setContentText notification]]></category>
		<category><![CDATA[setContentTitle notification]]></category>
		<category><![CDATA[setLatestEventInfo android]]></category>
		<category><![CDATA[setSmallIcon notification]]></category>
		<category><![CDATA[setTicker notification]]></category>
		<category><![CDATA[setWhen notification]]></category>
		<category><![CDATA[supprimer une notification android]]></category>
		<category><![CDATA[tutoriel notification android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=460</guid>
		<description><![CDATA[Le but de ce tutoriel est d’apprendre à utiliser les notifications sous Android, ce système facilite les interactions entre votre application et l&#8217;utilisateur lors de la survenue d’évènements particuliers. Le système de notifications fourni une indication permettant de prévenir l&#8217;utilisateur de certains évènements (arriver d&#8217;un SMS, mail, appel en absence &#8230;). Mise en place Nous [...]]]></description>
			<content:encoded><![CDATA[<p>Le but de ce tutoriel est d’apprendre à utiliser les notifications sous Android, ce système facilite les interactions entre votre application et l&#8217;utilisateur lors de la survenue d’évènements particuliers.</p>
<p>Le système de notifications fourni une indication permettant de prévenir l&#8217;utilisateur de certains évènements (arriver d&#8217;un SMS, mail, appel en absence &#8230;). </p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/08/android-jelly-bean-notifications-feature.jpg"><img src="http://www.tutos-android.com/wp-content/uploads/2012/08/android-jelly-bean-notifications-feature.jpg" alt="" title="android-jelly-bean-notifications-feature" width="300" height="349" class="aligncenter size-full wp-image-1236" /></a><br />
<span id="more-460"></span></p>
<h2><strong>Mise en place</strong></h2>
<p>Nous allons créer un projet qui comprendra deux boutons :</p>
<ul>
<li>Un pour créer une notification</li>
<li>Un autre pour en supprimer</li>
</ul>
<p>Commençons par créer un projet avec les données suivantes : </p>
<ul>
<li><strong>Nom du projet</strong> : tuto_notification</li>
<li><strong>SDK </strong>: 4.1</li>
<li><strong>Nom de l’application</strong> : Tuto Notification</li>
<li><strong>Nom du package</strong> : com.tutos.android.notification</li>
<li><strong>Activité</strong> : TutoNotificationHomeActivity</li>
</ul>
<h2><strong>Création de la vue principale</strong></h2>
<p>Nous allons modifier le fichier <strong>“main.xml”</strong> afin d’avoir deux boutons.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:orientation=&quot;vertical&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;fill_parent&quot;
    &gt;
&lt;Button  
    android:layout_width=&quot;fill_parent&quot; 
    android:layout_height=&quot;wrap_content&quot; 
    android:text=&quot;@string/add_notification&quot;
    android:id=&quot;@+id/add_notification&quot;
    /&gt;

&lt;Button  
    android:layout_width=&quot;fill_parent&quot; 
    android:layout_height=&quot;wrap_content&quot; 
    android:text=&quot;@string/delete_notification&quot;
    android:id=&quot;@+id/delete_notification&quot;
    /&gt;

&lt;/LinearLayout&gt;

</pre>
<p>Le fichier<strong> “strings.xml”</strong> pour rajouter les différentes strings pour le texte des boutons</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;resources&gt;
    &lt;string name=&quot;add_notification&quot;&gt;Ajouter une notification&lt;/string&gt;
    &lt;string name=&quot;delete_notification&quot;&gt;Supprimer une notification&lt;/string&gt;
    &lt;string name=&quot;app_name&quot;&gt;Tuto Notification&lt;/string&gt;
&lt;/resources&gt;
</pre>
<p>Voici le résultat que vous allez obtenir.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/08/device-2012-08-24-151535.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/08/device-2012-08-24-151535-576x1024.png" alt="" title="device-2012-08-24-151535" width="300" height="587" class="aligncenter size-large wp-image-1216" /></a></p>
<h2><strong>Rajouter le Listener sur les boutons</strong></h2>
<p>Nous allons rajouter des “Listener” sur les boutons pour gérer le clic. Ce qui donnera sur la classe <strong>“TutoNotificationHomeActivity”</strong></p>
<pre class="brush: java; title: ; notranslate">
package com.tutos.android.notification;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class TutoNotificationHomeActivity extends Activity {
    private Button addNotificationBtn;
    private Button deleteNotificationBtn;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        addNotificationBtn = (Button) findViewById(R.id.add_notification);
        addNotificationBtn.setOnClickListener(new OnClickListener() {
	    
	    @Override
	    public void onClick(View arg0) {
		Toast.makeText(getBaseContext(), &quot;Ajout d'une notification&quot;, Toast.LENGTH_SHORT).show();
	    }
	});
        
        deleteNotificationBtn = (Button) findViewById(R.id.delete_notification);
        deleteNotificationBtn.setOnClickListener(new OnClickListener() {
	    
	    @Override
	    public void onClick(View arg0) {
		Toast.makeText(getBaseContext(), &quot;Suppression d'une notification&quot;, Toast.LENGTH_SHORT).show();
	    }
	});
    }
}
</pre>
<h2><strong>Création d’une notification.</strong></h2>
<p>Nous allons créer une méthode <strong>“createNotification”</strong> qu’on appelera au clic sur le bouton <strong>“Ajouter une notification”</strong>. Voici a quoi ressemble cette méthode : </p>
<pre class="brush: java; title: ; notranslate">
 private final void createNotification(){
	final NotificationManager mNotification = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        final Intent launchNotifiactionIntent = new Intent(this, TutoNotificationHomeActivity.class);
	final PendingIntent pendingIntent = PendingIntent.getActivity(this,
				REQUEST_CODE, launchNotifiactionIntent,
				PendingIntent.FLAG_ONE_SHOT);

	Notification.Builder builder = new Notification.Builder(this)
		.setWhen(System.currentTimeMillis())
		.setTicker(notificationTitle)
		.setSmallIcon(R.drawable.notification)
		.setContentTitle(getResources().getString(R.string.notification_title))
		.setContentText(getResources().getString(R.string.notification_desc))
		.setContentIntent(pendingIntent);

	mNotification.notify(NOTIFICATION_ID, builder.build());
    }
</pre>
<p>La création d&#8217;une notification est trés simple et s&#8217;effectue en suivant les étapes décritent ci-dessous : </p>
<ul>
<li>Récupération d&#8217;une instance de la classe <strong>NotificationManager</strong></li>
<li>Créer l&#8217;intent correspondant à la vue lancée lors du clic sur la notification</li>
<li>Créer un pending intent décrivant l&#8217;intent précédant</li>
<li>Créer une notification à l&#8217;aide d&#8217;un <strong>Builder</strong>, en spécifiant le contexte, le délais de déclenchement de la notification, le titre de la notification, l&#8217;icone, le titre et la description du contenu de la notification, l&#8217;intent à lier à la notification.</li>
<li>Le déclenchement de la notification s&#8217;effectue à l&#8217;aide de la méthode <strong>notify</strong></li>
<p>Je vous met l’icone que j’ai utilisé pour la notification <a href="http://www.tutos-android.com/wp-content/uploads/2011/06/notification.png">ici</a>.<br />
Il suffit maintenant d’appeler la méthode dans votre code, ce qui donnera : </p>
<pre class="brush: java; title: ; notranslate">
  addNotificationBtn = (Button) findViewById(R.id.add_notification);
        addNotificationBtn.setOnClickListener(new OnClickListener() {
	    
	    @Override
	    public void onClick(View arg0) {
		createNotification();
	    }
	});
</pre>
<p>Il faut rajouter la permission <strong>“Vibration”</strong> dans<strong> l’AndroidManifest.xml</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;uses-permission android:name=&quot;android.permission.VIBRATE&quot; /&gt;
</pre>
<p>et les nouveaux textes dans le fichier “Strings.xml”</p>
<pre class="brush: xml; title: ; notranslate">
&lt;string name=&quot;notification&quot;&gt;Notification www.tutos-android.com&lt;/string&gt;
&lt;string name=&quot;notification_title&quot;&gt;Ma premiere notification www.tutos-android.com&lt;/string&gt;
&lt;string name=&quot;notification_desc&quot;&gt;Cliquez sur moi je suis une notification&lt;/string&gt;
</pre>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-151543.png"><img src="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-151543-576x1024.png" alt="" title="device-2012-08-24-151543" width="300" height="587" class="aligncenter size-large wp-image-1207" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-151555.png"><img src="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-151555-576x1024.png" alt="" title="device-2012-08-24-151555" width="300" height="587" class="aligncenter size-large wp-image-1208" /></a></p>
<h2><strong>Jelly Bean</strong></h2>
<p>La version JellyBean d&#8217;Android apporte quelques nouveautés aux notifications :</p>
<ul>
<li><strong>Priorité </strong>: Ce système permet d&#8217;indiquer la priorité d&#8217;une notification, plus la notification est prioritaire plus elle sera mise en avant dans la barre de notification. Elle peut posséder l&#8217;une des valeurs suivantes (<strong>PRIORITY_MAX</strong>, <strong>PRIORITY_HIGH</strong>, <strong>PRIORITY_DEFAULT</strong>, <strong>PRIORITY_LOW</strong>, <strong>PRIORITY_MIN</strong>)</li>
<li><strong>Nouvelles zones de contenues</strong> : Des nouvelles zones de contenus sont disponibles (<strong>bigPicture</strong>, <strong>bigText</strong>&#8230;) permettant d’enrichir vos notifications</li>
<li><strong>Actions </strong>: Vous pouvez rajouter des actions aux notification à l&#8217;aide de la méthode <strong>addAction</strong>. Ces actions permettent d&#8217;offrir à l&#8217;utilisateur un autre moyen d&#8217;interagir avec les notifications. Ce qui permet par exemple, lors de la réception d&#8217;un appel en absence, de rappeler directement la personne ou lui envoyer un sms.</li>
</ul>
<pre class="brush: java; title: ; notranslate">
Notification.Builder builder = new Notification.Builder(this)
	.setWhen(System.currentTimeMillis())
	.setTicker(notificationTitle)
	.setSmallIcon(R.drawable.notification)
	.setContentTitle(getResources().getString(R.string.notification_title))
	.setContentText(getResources().getString(R.string.notification_desc))
	.setContentIntent(pendingIntent)
	.addAction(R.drawable.play,&quot;Play&quot;, PendingIntent.getActivity(getApplicationContext(), 0,
		getIntent(), 0, null))
	.addAction(R.drawable.pause, &quot;Pause&quot;,
		PendingIntent.getActivity(getApplicationContext(), 0,
		getIntent(), 0, null));

	Notification notification = new Notification.BigPictureStyle(builder)
		.bigPicture(BitmapFactory.decodeResource(getResources(),
		R.drawable.zoidberg_android)).build();

        mNotification.notify(NOTIFICATION_ID, notification);

</pre>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-152043.png"><img src="http://www.tutos-android.com/wp-content/uploads/2011/06/device-2012-08-24-152043-576x1024.png" alt="" title="device-2012-08-24-152043" width="300" height="587" class="aligncenter size-large wp-image-1209" /></a></p>
<h2><strong>Suppression d’une notification</strong></h2>
<p>Nous allons créer une méthode <strong>“deleteNotification”</strong>, pour supprimer notre notification depuis l’application.</p>
<pre class="brush: java; title: ; notranslate">
 private void deleteNotification(){
    	final NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    	//la suppression de la notification se fait grâce a son ID
    	notificationManager.cancel(NOTIFICATION_ID);
    }
</pre>
<p>Puis l’appeler dans le code Java au moment du clic</p>
<pre class="brush: java; title: ; notranslate">
deleteNotificationBtn = (Button) findViewById(R.id.delete_notification);
        deleteNotificationBtn.setOnClickListener(new OnClickListener() {
	    
	    @Override
	    public void onClick(View arg0) {
		deleteNotification();
	    }
	});
</pre>
<p>Le projet sera très bientôt disponible en téléchargement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/notifications-android/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/notifications-android</feedburner:origLink></item>
		<item>
		<title>Multi-touch et fragments: Geste de “rotation”</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/nwPddcW9NdI/multi-touch-fragments-rotation</link>
		<comments>http://www.tutos-android.com/multi-touch-fragments-rotation#comments</comments>
		<pubDate>Sun, 09 Sep 2012 10:58:37 +0000</pubDate>
		<dc:creator>Arnaud Bossmann</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ACTION_MASK android]]></category>
		<category><![CDATA[ACTION_POINTER_DOWN android]]></category>
		<category><![CDATA[ACTION_POINTER_ID_MASK android]]></category>
		<category><![CDATA[ACTION_POINTER_UP android]]></category>
		<category><![CDATA[Gesture Android]]></category>
		<category><![CDATA[Gesture Builder android]]></category>
		<category><![CDATA[getAction android]]></category>
		<category><![CDATA[MotionEvent android]]></category>
		<category><![CDATA[multi-touch android]]></category>
		<category><![CDATA[multitouch android]]></category>
		<category><![CDATA[onTouch android]]></category>
		<category><![CDATA[OnTouchListener android]]></category>
		<category><![CDATA[rotation android]]></category>
		<category><![CDATA[setOnTouchListener android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=1077</guid>
		<description><![CDATA[Bonjour à tous! Ce nouveau tutoriel orienté algorithmique va tenter d&#8217;expliquer la manière de gérer le geste de rotation multitouch. Peu de code Java dans ce tutoriel, juste de quoi illustrer mes propos et donner des pistes de réflexion. La fonction principale sera détaillée mais exceptionnellement, je ne mettrai pas de projet en téléchargement par [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous! Ce nouveau tutoriel orienté algorithmique va tenter d&#8217;expliquer la manière de gérer le geste de rotation multitouch. Peu de code Java dans ce tutoriel, juste de quoi illustrer mes propos et donner des pistes de réflexion. La fonction principale sera détaillée mais exceptionnellement, je ne mettrai pas de projet en téléchargement par manque de temps pour l&#8217;implémenter proprement.</p>
<p>Pour les gestes simple-touch, l&#8217;implémentation est très facile grâce au <strong>Gesture Builder </strong> (tutoriel en anglais <a title="Gesture builder" href="http://www.vogella.com/articles/AndroidGestures/article.html">ici</a>), mais pour le multi-touch, c&#8217;est un peu plus compliqué car aucune library n&#8217;existe. Si on veut pouvoir utiliser des gestes cools dans son application, il faut donc les implémenter.</p>
<p><span id="more-1077"></span></p>
<h2><strong>Principe global</strong></h2>
<p>On souhaite reconnaître un mouvement de rotation effectué avec 2 doigts pour par exemple inverser 2 fragments positionnés l&#8217;un en dessous de l&#8217;autre comme indiqué sur l&#8217;image ci dessous.</p>
<p><img class="aligncenter" src="http://www.tutos-android.com/wp-content/uploads/2012/08/rotation.jpg" alt="rotation" /></p>
<p>Concrètement, nous allons enregistrer les coordonnées de départ et d&#8217;arrivée de nos deux doigts puis calculer l&#8217;angle formé par ceux-ci, comme indiqué dans le schéma ci-dessous. Dans notre cas, si l&#8217;angle mesuré est supérieur à 8° (par exemple), la rotation s&#8217;effectue.</p>
<h2>Algorithme</h2>
<p>On détecte lorsque plusieurs doigts sont posés sur l’écran puis on sauvegarde les coordonnées des points touchés. Lorsque les doigts sont enlevées, on enregistre également leurs coordonnées.<br />
<img class="aligncenter" src="http://www.tutos-android.com/wp-content/uploads/2012/08/doigts_rotation.jpg" alt="doigts" /><br />
On calcule ensuite le point d’intersection I de la droite formée par les deux doigts au départ celle formée à l’arrivée. Appelons A le point de départ du doigt 1 et B son point d’arrivée. L’étape suivante consite à calculer les distances des côtés du triangle ABI. Comme on possède les coordonnées de ces points, il ne reste qu’à utiliser la formule:</p>
<p>AB= (xA – xB)² + (yB – y1)² , où  A (xA, yA) et B (xB, yB)</p>
<p><img class="aligncenter" src="http://www.tutos-android.com/wp-content/uploads/2012/08/trigo_rotation.jpg" alt="trigo" /></p>
<p>Enfin, pour calculer l’angle en radian, on utilise le théorème d’Al Kashi (ou théorème de Pythagore généralisé) dont la formule est la suivante:<br />
<img class="aligncenter" src="http://www.tutos-android.com/wp-content/uploads/2012/08/formule_rotation.jpg" alt="formule" /></p>
<h2></h2>
<h2>Implémentation Java: quelques pistes</h2>
<p>Premièrement, il faut placer un listener sur votre layout principal, celui qui fait la taille de la page et qui contient tout les éléments. C&#8217;est lui qui captera l&#8217;évènement.</p>
<pre class="brush: java; title: ; notranslate">
mainLayout.setOnTouchListener(new View.OnTouchListener() {

	@Override
	public boolean onTouch(View view, MotionEvent motionEvent) {

		int pointerIndex = ((motionEvent.getAction() &amp; MotionEvent.ACTION_POINTER_ID_MASK) &gt;&gt; MotionEvent.ACTION_POINTER_ID_SHIFT);
		int action = (motionEvent.getAction() &amp; MotionEvent.ACTION_MASK);
		int pointCnt = motionEvent.getPointerCount();
		try {
			// On effectue un traitement seulement lorsque 2 doigts touchent l'écran
			if ((pointCnt == 2)&amp;&amp; (pointerIndex &lt;=1)){
				switch (action) {
					case MotionEvent.ACTION_POINTER_DOWN:
						// Sauvegarde des coordonnées de départ des 2 doigts
						for (int i = 0; i &lt; pointCnt; i++) {
							int id = motionEvent.getPointerId(i);
							//simple exemple de comment récupérer les coordonnées des points. Celles-ci doivent être traitées en fonction de ce que l'on veut faire
							float x= motionEvent.getX(i)
 							float y= motionEvent.getY(i));
						}
						break;

					case MotionEvent.ACTION_POINTER_UP:
						// Sauvegarde des coordonnées des doigts lorsque l'utilisateur les enlève de l'écran
						for (int i = 0; i &lt; pointCnt; i++) {
							int id = motionEvent.getPointerId(i);
							//simple exemple de comment récupérer les coordonnées des points. Celles-ci doivent être traitées en fonction de ce que l'on veut faire
							float x= motionEvent.getX(i)
 							float y= motionEvent.getY(i));
						}
						//calculer ici la valeur de l'angle formé, comme expliqué dans le paragraphe précédent
						break;

					default:
						break;
					
				}
			}
		} catch (Exception e) {
			Log.e(&quot;error&quot;, e.getMessage());
		}
		return true;
	}
});
</pre>
<h2></h2>
<h2>Conclusion</h2>
<p>En espérant que ce tutoriel vous soit utile pour la compréhension du multitouch. Vous avez maintenant toutes les cartes en main pour l&#8217;implémenter !</p>
<p class="Interligne11"><!--[if gte vml 1]&gt;--></p>
<p><!--[if !vml]--><span style="margin-left: 559px;margin-top: 62px;width: 11px;height: 12px"><img src="/Users/Arnaud/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif" alt="" width="11" height="12" /></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/multi-touch-fragments-rotation/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/multi-touch-fragments-rotation</feedburner:origLink></item>
		<item>
		<title>ActionBar sous Android (Partie 2)</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/v9mGdHToMn0/actionbar-menu-android-partie-2</link>
		<comments>http://www.tutos-android.com/actionbar-menu-android-partie-2#comments</comments>
		<pubDate>Fri, 20 Jul 2012 10:40:55 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ActionBar android]]></category>
		<category><![CDATA[actionbar android 2.2]]></category>
		<category><![CDATA[actionbar android 2.3]]></category>
		<category><![CDATA[actionbar en bas]]></category>
		<category><![CDATA[ajouter actionbar android]]></category>
		<category><![CDATA[always android]]></category>
		<category><![CDATA[android uiOptions]]></category>
		<category><![CDATA[android.R.id.home]]></category>
		<category><![CDATA[android:uiOptions]]></category>
		<category><![CDATA[android:uiOptions="splitActionBarWhenNarrow"]]></category>
		<category><![CDATA[Barre d'action Android]]></category>
		<category><![CDATA[Build android]]></category>
		<category><![CDATA[Build.VERSION.SDK_INT]]></category>
		<category><![CDATA[Build.VERSION_CODES]]></category>
		<category><![CDATA[compatibilité ActionBar android]]></category>
		<category><![CDATA[connaitre la version d'android]]></category>
		<category><![CDATA[gestion du clic actionbar android]]></category>
		<category><![CDATA[gestion du clic menu android]]></category>
		<category><![CDATA[getActionBar android]]></category>
		<category><![CDATA[ifRoom android]]></category>
		<category><![CDATA[implémenter actionbar android]]></category>
		<category><![CDATA[java verification version android]]></category>
		<category><![CDATA[menu actionbar android]]></category>
		<category><![CDATA[menu Android]]></category>
		<category><![CDATA[navigation icone action bar]]></category>
		<category><![CDATA[never android]]></category>
		<category><![CDATA[onBackPressed android]]></category>
		<category><![CDATA[onCreateOptionsMenu android]]></category>
		<category><![CDATA[onOptionsItemSelected android]]></category>
		<category><![CDATA[Separer une actionbar en deux]]></category>
		<category><![CDATA[setDisplayHomeAsUpEnabled android]]></category>
		<category><![CDATA[showAsAction android]]></category>
		<category><![CDATA[simuler clic sur bouton retour]]></category>
		<category><![CDATA[splitActionBarWhenNarrow android]]></category>
		<category><![CDATA[styles.xml android]]></category>
		<category><![CDATA[théme android]]></category>
		<category><![CDATA[verifier version android dynamiquement]]></category>
		<category><![CDATA[withText android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=1083</guid>
		<description><![CDATA[Voici la suite du tutoriel sur l&#8217;ActionBar. Dans cette partie, nous allons reprendre le projet crée lors du tutoriel précédant afin d&#8217;aborder les points suivants : La navigation à l&#8217;aide de l&#8217;icone de votre application (présente sur l&#8217;ActionBar) La séparation de l&#8217;ActionBar en deux Séparer l&#8217;ActionBar en deux Si vous possédez plusieurs actions importantes dans [...]]]></description>
			<content:encoded><![CDATA[<p>Voici la suite du tutoriel sur l&#8217;<strong>ActionBar</strong>. Dans cette partie, nous allons reprendre le projet crée lors du <a href="http://www.tutos-android.com/actionbar-menu-android" title="ActionBar android" target="_blank">tutoriel précédant</a> afin d&#8217;aborder les points suivants :</p>
<ul>
<li>La navigation à l&#8217;aide de l&#8217;icone de votre application (présente sur l&#8217;ActionBar)</li>
<li>La séparation de l&#8217;ActionBar en deux</li>
</ul>
<p><span id="more-1083"></span></p>
<h2><strong>Séparer l&#8217;ActionBar en deux</strong></h2>
<p>Si vous possédez plusieurs actions importantes dans votre application, vous pouvez séparer votre barre d&#8217;action en deux : </p>
<ul>
<li>La première ActionBar contiendra l&#8217;icone de votre application, le titre et la navigation de votre application (Dropdown menu)</li>
<li>La deuxième ActionBar contiendra les différentes actions disponibles via votre application </li>
</ul>
<p>Cette fonctionnalité est disponible <strong>qu&#8217;à partir de l&#8217;API 14</strong> d&#8217;Android donc à partir de la version 4.0 d&#8217;Android.</p>
<p>Pour séparer votre ActionBar en deux, il suffit de rajouter l&#8217;attribut <strong>android:uiOptions=&#8221;splitActionBarWhenNarrow&#8221;</strong> sur la balise <strong>application</strong> (si vous souhaitez séparer votre <strong>ActionBar</strong> sur toute l&#8217;application) ou sur la balise <strong>activity</strong> (si vous souhaitez séparer votre ActionBar uniquement sur quelques activités cibles) du fichier manifeste de l&#8217;application.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;activity
   android:name=&quot;.NextActivity&quot;
   android:uiOptions=&quot;splitActionBarWhenNarrow&quot; &gt;
&lt;/activity&gt;
</pre>
<p>Ce qui donnera sur un appareil Android (4.0 ou supérieur)</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-121756.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-121756-576x1024.png" alt="" title="device-2012-07-20-121756" width="576" height="1024" class="aligncenter size-large wp-image-1090" /></a></p>
<h2><strong>Navigation via l&#8217;icone de votre application</strong></h2>
<p>Afin de pouvoir activer la navigation via l&#8217;icone de votre application (icone disponible sur l&#8217;ActionBar), il suffit de rajouter le code suivant dans la méthode <strong>onCreateOptionsMenu</strong> (aprés le chargement du fichier XML représentant votre menu/ActionBar).</p>
<pre class="brush: java; title: ; notranslate">
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
</pre>
<ul>
<li>La première ligne permet de récupérer l&#8217;instance de l&#8217;ActionBar</li>
<li>La deuxième ligne permet d&#8217;activer la navigation à l&#8217;aide de l&#8217;icone de votre application</li>
</ul>
<p>La méthode <strong>setDisplayHomeAsUpEnabled</strong> est disponible qu&#8217;a partir d&#8217;Android 3.0 (Honeycomb). Afin de conserver la compatibilité avec les anciennes version d&#8217;Android, il faut vérifier la version actuelle de l&#8217;appareil avant d&#8217;éxecuter cette partie du code. Cette vérification s&#8217;effectue rapidement à l&#8217;aide de  la classe <strong>Build.VERSION.SDK_INT</strong>.</p>
<p>Ce qui donnera : </p>
<pre class="brush: java; title: ; notranslate">
@Override
public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.activity_main, menu);
	if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB) {
		ActionBar actionBar = getActionBar();
		actionBar.setDisplayHomeAsUpEnabled(true);
	}
	return true;
}
</pre>
<p>Si vous exécutez l&#8217;exemple, vous allez remarquer que l&#8217;icone devient cliquable (aucune action n&#8217;est liée à ce clic pour le moment)</p>
<p>Pour pouvoir exécuter l&#8217;action de votre choix lors du clic sur l&#8217;icone, il faut gérer l&#8217;élement <strong>android.R.id.home</strong> dans la méthode <strong>onOptionsItemSelected</strong>. Vous pouvez par exemple revenir à l&#8217;activité lancée précédemment (<strong>onBackPressed </strong>: permet de simuler le clic sur le bouton précedant) ou lancer l&#8217;activité de votre choix.</p>
<pre class="brush: java; title: ; notranslate">
@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
		case android.R.id.home:
			onBackPressed();
		case R.id.menu_about:
			// Comportement du bouton &quot;A Propos&quot;
			return true;
		case R.id.menu_help:
			// Comportement du bouton &quot;Aide&quot;
			return true;
		case R.id.menu_refresh:
			// Comportement du bouton &quot;Rafraichir&quot;
			return true;
		case R.id.menu_search:
			// Comportement du bouton &quot;Recherche&quot;
			return true;
		case R.id.menu_settings:
			// Comportement du bouton &quot;Paramétres&quot;
			return true;
		default:
			return super.onOptionsItemSelected(item);
	}
}
</pre>
<p>Ce qui donnera :<br />
<strong>Android 3.0</strong></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-120644.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-120644.png" alt="" title="device-2012-07-20-120644" width="1280" height="74" class="aligncenter size-full wp-image-1096" /></a></p>
<p><strong>Android 4.0</strong></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-1217561.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-20-1217561.png" alt="" title="device-2012-07-20-121756" width="720" height="99" class="aligncenter size-full wp-image-1094" /></a></p>
<p>Vous pouvez trouver le code de cet exemple <a href="http://www.tutos-android.com/wp-content/uploads/2012/07/ActionBarPartie2.zip" target="_blank">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/actionbar-menu-android-partie-2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/actionbar-menu-android-partie-2</feedburner:origLink></item>
		<item>
		<title>ActionBar sous Android (Partie 1)</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/uUi4eHkYYgQ/actionbar-menu-android</link>
		<comments>http://www.tutos-android.com/actionbar-menu-android#comments</comments>
		<pubDate>Sun, 15 Jul 2012 14:05:23 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ActionBar android]]></category>
		<category><![CDATA[actionbar android 2.2]]></category>
		<category><![CDATA[actionbar android 2.3]]></category>
		<category><![CDATA[ajouter actionbar android]]></category>
		<category><![CDATA[always android]]></category>
		<category><![CDATA[Barre d'action Android]]></category>
		<category><![CDATA[compatibilité ActionBar android]]></category>
		<category><![CDATA[gestion du clic actionbar android]]></category>
		<category><![CDATA[gestion du clic menu android]]></category>
		<category><![CDATA[ifRoom android]]></category>
		<category><![CDATA[implémenter actionbar android]]></category>
		<category><![CDATA[menu actionbar android]]></category>
		<category><![CDATA[menu Android]]></category>
		<category><![CDATA[never android]]></category>
		<category><![CDATA[onCreateOptionsMenu android]]></category>
		<category><![CDATA[onOptionsItemSelected android]]></category>
		<category><![CDATA[showAsAction android]]></category>
		<category><![CDATA[styles.xml android]]></category>
		<category><![CDATA[théme android]]></category>
		<category><![CDATA[withText android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=1051</guid>
		<description><![CDATA[La version 3.0 d&#8217;Android (Honeycomb) à introduit un nouveau composant essentiel dans une application, il s&#8217;agit de la barre d&#8217;action (ActionBar). Ce composant remplace les menus disponibles dans les anciennes version d&#8217;Android et permet à l&#8217;utilisateur d&#8217;accéder facilement aux fonctionnalités les plus importantes d&#8217;une application. Voici l&#8217;exemple de l&#8217;ActionBar dans l&#8217;application Google + : Principe [...]]]></description>
			<content:encoded><![CDATA[<p>La version 3.0 d&#8217;Android (Honeycomb) à introduit un nouveau composant essentiel dans une application, il s&#8217;agit de la barre d&#8217;action (<strong>ActionBar</strong>).<br />
Ce composant remplace les menus disponibles dans les anciennes version d&#8217;Android et permet à l&#8217;utilisateur d&#8217;accéder facilement aux fonctionnalités les plus importantes d&#8217;une application. </p>
<p>Voici l&#8217;exemple de l&#8217;ActionBar dans l&#8217;application Google + : </p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-144201.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-144201.png" alt="Action Bar Google +" title="device-2012-07-15-144201" width="100%" height="96" class="aligncenter size-full wp-image-1052" /></a></p>
<p><span id="more-1051"></span></p>
<h2><strong>Principe</strong></h2>
<p>Une <strong>ActionBar</strong> peut se composer de 4 parties : </p>
<ul>
<li> <strong>L&#8217;icone de l&#8217;application</strong> : Etablie l&#8217;identité visuelle de l&#8217;application et permet aussi de naviguer dans l&#8217;application (remonter à la vue mère par exemple).</li>
<li> <strong>Dropdown Menu</strong> : Permet d&#8217;afficher le titre de la vue actuelle ainsi que naviguer dans l&#8217;application (exemple de l&#8217;application Gmail).</li>
<li> <strong>Actions principales</strong> : Définie les actions principales de votre application.</li>
<li> <strong>Autres actions</strong> : Permet d&#8217;accéder aux fonctionnalités moins importantes de l&#8217;application.</li>
</ul>
<p>L&#8217;implémentation d&#8217;une ActionBar s&#8217;effectue dans le dossier <strong>menu</strong> (situé dans le dossier <strong>res</strong> de votre projet) et ressemble énormément à l&#8217;implémentation d&#8217;un menu.<br />
Afin de gérer la compatibilité avec des versions d&#8217;Android ne possédant pas d&#8217;ActionBar (entre 1.6 et 2.3.x), il est conseillé de remplacer son implémentation par des menus et cela en créent plusieurs dossiers : </p>
<ul>
<li> fichier <strong>styles.xml</strong> dans le dossier values: Permet de spécifier le thème utilisé par l&#8217;application et donc un thème n&#8217;utilisant pas de barre d&#8217;action (conversion automatique en menu).</li>
<li> fichier <strong>styles.xml</strong> dans le dossier values-v11 : Permet de spécifier le thème utilisé (thème Honeycomb) utilisant les ActionBar fournies par cette version d&#8217;Android.</li>
<li> fichier <strong>styles.xml</strong> dans le dossier values-v14 : Permet de spécifier le thème utilisé (thème ICS / JellyBean) utilisant les ActionBar fournies par cette version d&#8217;Android.</li>
<li>Le chiffre se situant aprés la lettre v correspond au numéro de l&#8217;<a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels" title="API Level Android" target="_blank">API Android cible</a></li>
</ul>
<h2><strong>Exemple</strong></h2>
<p>L&#8217;exemple abordé dans cette partie servira à implémenter une ActionBar pour les appareils 3.x et supérieur et un menu pour les autres.</p>
<p>Nous allons créer une application Android possédant les actions suivantes (accessible via ActionBar ou via menu) : </p>
<ul>
<li>Recherche</li>
<li>Rafraichir</li>
<li>Aide</li>
<li>A propos</li>
<li>Paramètres</li>
</ul>
<p>Dans le dossier <strong>menu</strong> présent dans le dossier <strong>res</strong>, créez un fichier XML représentant votre menu : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &gt;

    &lt;item
        android:id=&quot;@+id/menu_search&quot;
        android:icon=&quot;@drawable/ic_action_search&quot;
        android:showAsAction=&quot;ifRoom&quot;
        android:title=&quot;@string/menu_search&quot;/&gt;
    &lt;item
        android:id=&quot;@+id/menu_refresh&quot;
        android:icon=&quot;@drawable/ic_action_refresh&quot;
        android:showAsAction=&quot;ifRoom&quot;
        android:title=&quot;@string/menu_refresh&quot;/&gt;
    &lt;item
        android:id=&quot;@+id/menu_help&quot;
        android:icon=&quot;@drawable/ic_action_help&quot;
        android:showAsAction=&quot;ifRoom&quot;
        android:title=&quot;@string/menu_help&quot;/&gt;
    &lt;item
        android:id=&quot;@+id/menu_about&quot;
        android:icon=&quot;@drawable/ic_action_about&quot;
        android:showAsAction=&quot;never&quot;
        android:title=&quot;@string/menu_about&quot;/&gt;
    &lt;item
        android:id=&quot;@+id/menu_settings&quot;
        android:icon=&quot;@drawable/ic_action_settings&quot;
        android:showAsAction=&quot;never&quot;
        android:title=&quot;@string/menu_settings&quot;/&gt;

&lt;/menu&gt;
</pre>
<ul>
<li>Chaque élement du menu correspond à la déclaration d&#8217;une balise <strong>item</strong></li>
<li>Chaque élement possède un identifiant, une icone (nom conseillé : ic_action_*), un titre</li>
<li>L&#8217;attribut <strong>showAsAction</strong> permet de spécifier le comportement de l&#8217;élement dans une ActionBar, il peut posséder les valeurs suivantes :
<ul>
<li><strong>ifRoom</strong> : L&#8217;élement sera ajouté aux actions principales de l&#8217;ActionBar si une place est disponible</li>
<li><strong>never</strong> : Ne jamais rajouter l&#8217;action aux actions principales de l&#8217;ActionBar</li>
<li><strong>always</strong> : Toujours rajouter l&#8217;action aux actions principales de l&#8217;ActionBar. Cette valeur n&#8217;est pas conseillé car peut entrainer une superposition d&#8217;élement (si nombre de place disponible < nombre d'élément ajouté à l'ActionBar), préférez la valeur ifRoom.</li>
<li><strong>withText</strong> : Toujours afficher le texte représentant l&#8217;action</li>
</ul>
</ul>
<p>Sans oublier d&#8217;implémenter les fichiers styles.xml présent dans les dossiers (values / values-v11 / values-v14)</p>
<p><strong>values/styles.xml</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;resources&gt;
    &lt;style name=&quot;AppTheme&quot; parent=&quot;android:Theme.Light&quot; /&gt;
&lt;/resources&gt;
</pre>
<p><strong>values-v11/styles.xml</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;resources&gt;
    &lt;style name=&quot;AppTheme&quot; parent=&quot;android:Theme.Holo.Light.DarkActionBar&quot; /&gt;
&lt;/resources&gt;
</pre>
<p><strong>values-v14/styles.xml</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;resources&gt;
    &lt;style name=&quot;AppTheme&quot; parent=&quot;android:Theme.Holo.Light.DarkActionBar&quot; /&gt;
&lt;/resources&gt;
</pre>
<p>Maintenant, dans l&#8217;activité principale implementer la méthode <strong>onCreateOptionsMenu</strong> afin de charger le menu crée précédemment.</p>
<pre class="brush: java; title: ; notranslate">
  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
</pre>
<p>Afin de gérer le clic sur les différents éléments du menu, implémenter la méthode <strong>onOptionsItemSelected</strong> afin de spécifier l&#8217;action à executer en fonction du bouton cliqué :</p>
<pre class="brush: java; title: ; notranslate">
@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case R.id.menu_about:
		// Comportement du bouton &quot;A Propos&quot;
		return true;
	case R.id.menu_help:
		// Comportement du bouton &quot;Aide&quot;
		return true;
	case R.id.menu_refresh:
		// Comportement du bouton &quot;Rafraichir&quot;
		return true;
	case R.id.menu_search:
		// Comportement du bouton &quot;Recherche&quot;
		return true;
	case R.id.menu_settings:
		// Comportement du bouton &quot;Paramètres&quot;
		return true;
	default:
		return super.onOptionsItemSelected(item);
	}
}
</pre>
<p>Ce qui donnera :</p>
<h3><strong>Android 2.3</strong></h3>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-153854.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-153854.png" alt="" title="device-2012-07-15-153854" width="480" height="800" class="aligncenter size-full wp-image-1067" /></a></p>
<h3><strong>Android 3.0</strong></h3>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-155352.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-155352-1024x640.png" alt="" title="device-2012-07-15-155352" width="640" height="400" class="aligncenter size-large wp-image-1070" /></a></p>
<h3><strong>Android 4.1</strong></h3>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-154005.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/device-2012-07-15-154005-576x1024.png" alt="" title="device-2012-07-15-154005" width="576" height="1024" class="aligncenter size-large wp-image-1068" /></a></p>
<p>Vous pouvez remarquer que tous les éléments possédant la valeurs &#8220;<strong>ifRoom</strong>&#8221; sont ajoutés dans l&#8217;ordre des déclarations, ce qui fait que le 3éme élement ne peux pas être rajouté à l&#8217;ActionBar.</p>
<h2><strong>Conclusion</strong></h2>
<p>Voila cette premiére partie s&#8217;arrête ici, vous pouvez télécharger le projet ayant servi d&#8217;exemple à <a href="http://www.tutos-android.com/wp-content/uploads/2012/07/ActionBarPartie1.zip" title="Projet Action Bar" target="_blank">cette adresse</a></p>
<p>La deuxiéme partie disponible bientôt abordera : </p>
<ul>
<li>La navigation via l&#8217;icone de l&#8217;application.</li>
<li>Séparation de l&#8217;ActionBar en deux.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/actionbar-menu-android/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/actionbar-menu-android</feedburner:origLink></item>
		<item>
		<title>Présentation de mon nouveau projet …… Un livre</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/Aln_tux_GDs/presentation-projet-livre-developpement-android</link>
		<comments>http://www.tutos-android.com/presentation-projet-livre-developpement-android#comments</comments>
		<pubDate>Mon, 09 Jul 2012 12:11:42 +0000</pubDate>
		<dc:creator>Benbourahla Nazim</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Livre Android]]></category>
		<category><![CDATA[Livre Android 4]]></category>
		<category><![CDATA[Livre Android Ice Cream Sandwich]]></category>
		<category><![CDATA[Livre Android Jelly Bean]]></category>
		<category><![CDATA[Livre Développement Android]]></category>
		<category><![CDATA[Livre Développement Android 4]]></category>
		<category><![CDATA[Livre Développement Android Ice Cream Sandwich]]></category>
		<category><![CDATA[Livre Développement Android Jelly Bean]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=994</guid>
		<description><![CDATA[Bonjour à tous, Je n&#8217;ai pas pu écrire d&#8217;articles depuis un moment et je vous avouerais que cela m&#8217;a beaucoup manqué. Cette absence est due à un projet que j&#8217;ai commencé depuis un long moment et qui vient de rentrer dans sa dernière étape. Il s&#8217;agit de l&#8217;écriture d&#8217;un livre sur le développement d&#8217;applications Android [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Je n&#8217;ai pas pu écrire d&#8217;articles depuis un moment et je vous avouerais que cela m&#8217;a beaucoup manqué. Cette absence est due à un projet que j&#8217;ai commencé depuis un long moment et qui vient de rentrer dans sa dernière étape. Il s&#8217;agit de l&#8217;écriture d&#8217;un livre sur le développement d&#8217;applications Android dont le titre sera : &#8220;<a href="http://www.editions-eni.fr/livres/android-4-les-fondamentaux-du-developpement-d-applications-java/.5725503fc23a20668eb509c241beac3a.html" target="_blank"><strong>Android 4 – Les fondamentaux du développement d’applications Java</strong></a>&#8220;.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/07/51w0tR3XN5L._SL500_AA300_1.jpg"><img src="http://www.tutos-android.com/wp-content/uploads/2012/07/51w0tR3XN5L._SL500_AA300_1.jpg" alt="" title="51w0tR3XN5L._SL500_AA300_" width="300" height="300" class="aligncenter size-full wp-image-1180" /></a></p>
<p><span id="more-994"></span></p>
<p>J&#8217;ai consacré toute mon energie et mon temps libre à cet ouvrage, cela explique pourquoi je n&#8217;ai pas pu tenir à jour le blog aussi régulièrement que d&#8217;habitude (je remercie toutes les personnes ayant écrit des articles sur le blog) mais des nouveaux articles arriveront trés bientôt <img src='http://www.tutos-android.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Cet ouvrage sera disponible dans le courant du mois de <strong>Septembre</strong> et il s&#8217;adressera aux débutants souhaitant se perfectionner (ainsi qu&#8217;aux personnes n&#8217;ayant jamais fait de développement Android) et connaitre tous les fondamentaux du développement Android 4 (<strong>Ice Cream Sandwich</strong>) en incluant les nouveautés d&#8217;Android 4.1 (<strong>Jelly Bean</strong>)</p>
<p>Rien n&#8217;est plus parlant que la table des matières de l&#8217;ouvrage : </p>
<h3><strong>Chapitre 1 : La plateforme Android </strong></h3>
<ol>
<li>Présentation</li>
<li>Historique</li>
<li>Google Play</li>
<ol>
<li>Création d’un compte développeur</li>
<li>Publication d’une application</li>
<li>Suivi et mise à jour d’une application</li>
</ol>
</ol>
<h3><strong>Chapitre 2 : Environnement de développement</strong></h3>
<ol>
<li>Installation de l’environnement Java</li>
<li>SDK Android</li>
<ol>
<li>Présentation</li>
<li>Installation</li>
<li>Utilisation</li>
</ol>
<li>Eclipse</li>
<ol>
<li>Présentation</li>
<li>Installation</li>
<li>Configuration</li>
</ol>
<li>Plugin ADT</li>
<ol>
<li>Présentation</li>
<li>Installation</li>
<li>Configuration</li>
</ol>
<li>Emulateur</li>
<ol>
<li>Présentation</li>
<li>Création</li>
<li>Configuration</li>
<li>Création d’émulateur en ligne de commande</li>
</ol>
</ol>
<h3><strong>Chapitre 3 : Principe de programmation</strong></h3>
<ol>
<li>Principes généraux</li>
<ol>
<li>Dalvik</li>
<li>Architecture Android</li>
<li>NDK</li>
<li>APK</li>
</ol>
<li>Composantes Android</li>
<ol>
<li>Activity</li>
<li>Fragment</li>
<li>Service</li>
<li>Broadcast Receiver</li>
<li>Content Provider</li>
<li>Intent</li>
</ol>
<li>La classe Application</li>
<li>Le cycle de vie d’une activité</li>
<ol>
<li>Etat d’une activité</li>
<li>Back Stack</li>
<li>Le cycle de vie</li>
</ol>
<li>Contexte d’une application</li>
<li>Manifeste</li>
<ol>
<li>Installation de l’application</li>
<li>La description de votre application</li>
</ol>
<li>Permissions</li>
<ol>
<li>Utiliser une permission</li>
<li>Déclarer vos permissions</li>
</ol>
</ol>
<h3><strong>Chapitre 4 : Ma première application &#8211; HelloAndroid</strong></h3>
<ol>
<li>Création du projet</li>
<li>Architecture du projet</li>
<li>Explication</li>
<ol>
<li>Android Manifeste</li>
<li>Ressources</li>
<li>Fichier généré</li>
<li>Fichier source</li>
</ol>
<li>Résultat</li>
</ol>
<h3><strong>Chapitre 5 : Débogage et gestion des erreurs</strong></h3>
<ol>
<li>Principes</li>
<li>DDMS</li>
<li>Les logs</li>
<ol>
<li>Logcat</li>
<li>Utiliser les logs</li>
</ol>
<li>Utilisation du SDK Android</li>
<ol>
<li>ADB</li>
</ol>
<li>Débogage pas à pas</li>
<li>Interaction avec l’émulateur</li>
<ol>
<li>Simuler des appels</li>
<li>Simuler des messages</li>
<li>Simuler une position GPS</li>
<li>Faire des captures d’écrans</li>
</ol>
<li>Tests sur le téléphone</li>
<ol>
<li>Utiliser votre téléphone</li>
<li>Options de développement</li>
</ol>
<li>Tests unitaires</li>
<li>Tests d’interfaces</li>
<ol>
<li>Monkey</li>
<li>Robotium</li>
</ol>
</ol>
<h3><strong>Chapitre 6 : Création d’interfaces simples</strong></h3>
<ol>
<li>Principe</li>
<ol>
<li>Déclarer des identifiants</li>
<li>Combiner avec les activités</li>
<li>Spécifier la taille des éléments</li>
</ol>
<li>Les layouts</li>
<ol>
<li>FrameLayout</li>
<li>LinearLayout</li>
<li>TableLayout</li>
<li>RelativeLayout</li>
<li>GridLayout</li>
</ol>
<li>Les ressources</li>
<ol>
<li>Drawable</li>
<li>Values</li>
</ol>
<li>Les éléments indispensables</li>
<ol>
<li>Zone d’affichage d’un texte</li>
<li>Zone d’Edition d’un texte</li>
<li>Bouton</li>
<li>Case à cocher</li>
<li>Image</li>
<li>Gestion du clic</li>
</ol>
<li>Barre d’actions</li>
<ol>
<li>Principe</li>
<li>Exemple</li>
<li>Séparer la barre d’action en deux</li>
</ol>
<li>Les menus</li>
</ol>
<h3><strong>Chapitre 7 : Communication entre vues / applications</strong></h3>
<ol>
<li>Principe</li>
<li>Navigation entre écrans</li>
<li>Passage de données entre écrans</li>
<ol>
<li>Obtenir un résultat</li>
<li>Parcelable</li>
</ol>
<li>Appeler d’autres applications</li>
<li>Trouver l’action à exécuter</li>
</ol>
<h3><strong>Chapitre 8 : Personnalisation et Gestion des évènements</strong></h3>
<ol>
<li>Personnalisation</li>
<ol>
<li>Thème</li>
<li>Etat des composants</li>
<li>Dégradé</li>
<li>Polices</li>
<li>Icones</li>
</ol>
<li>Animations</li>
<ol>
<li>Tween Animation</li>
<li>Frame Animation</li>
<li>Changement de vue</li>
</ol>
<li>Internationalisation</li>
<li>Gestion des évènements</li>
<ol>
<li>Appuie sur des touches</li>
<li>Surveillance de la saisie</li>
</ol>
<li>Notifications</li>
<ol>
<li>Apparence</li>
<li>Implémentation</li>
</ol>
<li>Gestion de la rotation</li>
<ol>
<li>Gestion du mode paysage</li>
<li>Bloquer la vue dans un seul mode</li>
<li>Gérer manuellement la rotation de l’écran</li>
</ol>
<li>Création de vues personnalisées</li>
</ol>
<h3><strong>Chapitre 9 : Création d’interfaces avancées</strong></h3>
<ol>
<li>Les listes</li>
<ol>
<li>Création d’une liste</li>
</ol>
<li>Fragment</li>
<ol>
<li>Cycle de vie d’un fragment</li>
<li>Exemple</li>
</ol>
<li>Passage en plein écran</li>
<li>Interfaces dynamiques</li>
<li>Création d’onglets</li>
<ol>
<li>Principe
<li>Implémentation d’onglets scrollables</li>
</ol>
<li>Les popups</li>
<ol>
<li>Les toasts</li>
<li>AlertDialog</li>
<li>ProgressDialog</li>
<li>Boite de dialogue personnalisé</li>
</ol>
<li>Préférences</li>
<li>WebView</li>
<ol>
<li>Exemple d’une page web distante</li>
<li>Paramètres de la WebView</li>
<li>Gestion du bouton retour</li>
<li>Utilisation d’Android natif dans du Javascript</li>
</ol>
<li>Gestions des différentes tailles et densités d’écrans</li>
<ol>
<li>Soyez indépendant de la résolution de l’écran</li>
<li>Soyez indépendant de la taille de l’écran</li>
<li>Soyez indépendant de la version d’Android utilisée</li>
<li>Soyez performant</li>
</ol>
<li>Optimiser vos interfaces</li>
<ol>
<li>Inspecter l’hiérarchie de vos interfaces</li>
<li>Fusionner des layouts</li>
<li>Inclure des vues</li>
<li>Chargement paresseux des layouts</li>
</ol>
</ol>
<h3><strong>Chapitre 10 : Persistance de données</strong></h3>
<ol>
<li>SharedPreferences</li>
<li>Stockage interne</li>
<ol>
<li>Ecriture d’un fichier</li>
<li>Lecture d’un fichier</li>
</ol>
<li>Stockage externe</li>
<ol>
<li>Tester la disponibilité du stockage externe</li>
<li>Accéder aux fichiers d’une application</li>
<li>Accéder aux fichiers partagés</li>
</ol>
<li>Stockage en base de données</li>
</ol>
<h3><strong>Chapitre 11 : Gestion et partage de données</strong></h3>
<ol>
<li>ContentProvider</li>
<ol>
<li>Créer un ContentProvider</li>
<li>Utiliser un ContentProvider</li>
</ol>
<li>Partage des données avec d’autres applications</li>
<li>Recevoir des données depuis d’autres applications</li>
<li>Récupération de données stockées en ligne</li>
<ol>
<li>Se connecter au réseau internet d’un appareil</li>
<li>Gestion du changement de connectivité</li>
<li>Connexion à une adresse distante</li>
<li>Parsing XML</li>
<li>Parsing JSON</li>
</ol>
</ol>
<h3><strong>Chapitre 12 : Traitement en tâche de fond</strong></h3>
<ol>
<li>Principe</li>
<li>AsyncTask</li>
<li>Thread et Handler</li>
<li>Les services</li>
<ol>
<li>Créer et utiliser un service</li>
<li>Lier un service à une activité</li>
</ol>
<li>Broadcast Receiver</li>
<ol>
<li>Recevoir un évènement</li>
<li>Envoyer un évènement</li>
</ol>
<li>Widget</li>
<ol>
<li>Implémentation</li>
</ol>
<li>Alarme</li>
<ol>
<li>Implémentation</li>
</ol>
</ol>
<h3><strong>Chapitre 13 : Google Map et Géolocalisation</strong></h3>
<ol>
<li>Prérequis</li>
<ol>
<li>Installation des APIs Google</li>
<li>Récupération de votre clé Google Map</li>
</ol>
<li>Intégration d’une Google Map</li>
<ol>
<li>Création de la vue Google Map</li>
<li>Ajout d’options à la Google Map</li>
</ol>
<li>Localisation</li>
<ol>
<li>Une position toute suite</li>
</ol>
<li>Position de l’utilisateur</li>
<li>Placement de marqueur sur la carte</li>
<li>Conversion position / adresse</li>
</ol>
<h3><strong>Chapitre 14 : Téléphonie</strong></h3>
<ol>
<li>Principe</li>
<li>Gestion des appels</li>
<ol>
<li>Passer un appel</li>
<li>Information sur les propriétés du téléphone</li>
<li>Appel entrant</li>
</ol>
<li>Gestion des messages</li>
<ol>
<li>Envoi de SMS</li>
<li>Réception d’un message</li>
</ol>
</ol>
<h3><strong>Chapitre 15 : Accès au matériel</strong></h3>
<ol>
<li>Caméra</li>
<ol>
<li>Utiliser l’application caméra de l’appareil</li>
<li>Contrôler la caméra</li>
<li>Enregistrer une vidéo</li>
</ol>
<li>Les capteurs sous Android</li>
<ol>
<li>Principe</li>
<li>Accéléromètre</li>
<li>Gyroscope</li>
<li>Capteur magnétique</li>
</ol>
<li>Bluetooth</li>
<ol>
<li>Activer le Bluetooth</li>
</ol>
<li>NFC</li>
<li>TTS (Text To Speech)</li>
</ol>
<p>Voila cette petite présentation s&#8217;arrête ici, je vous tiendrais au courant dés que j&#8217;aurais plus de précision.</p>
<p>Les prochains articles du blog utiliseront les versions 4.0 et 4.1 d&#8217;Android et il y aura une mise à jour des articles déjà présents sur le blog pour tenir compte des nouveautés de ces deux versions.</p>
<p>N&#8217;hésitez pas si vous avez des questions et Merci à tous</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/presentation-projet-livre-developpement-android/feed</wfw:commentRss>
		<slash:comments>28</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/presentation-projet-livre-developpement-android</feedburner:origLink></item>
		<item>
		<title>Créer un Live Wallpaper sous Android</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/TB28d4H8U40/creer-live-wallpaper-fond-ecran-android</link>
		<comments>http://www.tutos-android.com/creer-live-wallpaper-fond-ecran-android#comments</comments>
		<pubDate>Thu, 26 Apr 2012 21:46:03 +0000</pubDate>
		<dc:creator>Amine Ait omar</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[android:description]]></category>
		<category><![CDATA[android:thumbnail]]></category>
		<category><![CDATA[Bitmap android]]></category>
		<category><![CDATA[BitmapFactory decodeResource android]]></category>
		<category><![CDATA[Canvas android]]></category>
		<category><![CDATA[canvas drawBitmap android]]></category>
		<category><![CDATA[canvas drawColor android]]></category>
		<category><![CDATA[créer un fond d'écran animé android]]></category>
		<category><![CDATA[créer un live wallpaper android]]></category>
		<category><![CDATA[draw android]]></category>
		<category><![CDATA[draw live wallpaper android]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Engine android]]></category>
		<category><![CDATA[fond d'écran animé android]]></category>
		<category><![CDATA[getSurfaceHolder android]]></category>
		<category><![CDATA[handler android]]></category>
		<category><![CDATA[handler post android]]></category>
		<category><![CDATA[handler postDelayed]]></category>
		<category><![CDATA[live wallpaper android]]></category>
		<category><![CDATA[lockCanvas android]]></category>
		<category><![CDATA[onCreateEngine]]></category>
		<category><![CDATA[onCreateEngine android]]></category>
		<category><![CDATA[onSurfaceChanged android]]></category>
		<category><![CDATA[onSurfaceCreated android]]></category>
		<category><![CDATA[onSurfaceDestroyed android]]></category>
		<category><![CDATA[onTouchEvent Android]]></category>
		<category><![CDATA[onVisibilityChanged android]]></category>
		<category><![CDATA[removeCallbacks]]></category>
		<category><![CDATA[removeCallbacks android]]></category>
		<category><![CDATA[runnable android]]></category>
		<category><![CDATA[setTouchEventsEnabled]]></category>
		<category><![CDATA[setTouchEventsEnables android]]></category>
		<category><![CDATA[SurfaceHolder android]]></category>
		<category><![CDATA[thumbnail android wallpaper]]></category>
		<category><![CDATA[unlockCanvasAndPost android]]></category>
		<category><![CDATA[wallpaper android]]></category>
		<category><![CDATA[WallpaperService]]></category>
		<category><![CDATA[WallpaperService android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=939</guid>
		<description><![CDATA[Dans cet article nous allons apprendre à réaliser un Live Wallpaper sous Android, autrement dit, un fond d’écran animé et interactif. Sous Android, une classe permettant de développer des wallpapers est la classe «WallpaperService». Cette classe est disponible depuis la version 2.1 d’Android. Mon premier Live Wallpaper Le but est de créer un live wallpaper contenant [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cet article nous allons apprendre à réaliser un <strong>Live Wallpaper</strong> sous Android, autrement dit, un fond d’écran animé et interactif.<br />
Sous Android, une classe permettant de développer des wallpapers est la classe <strong>«WallpaperService».</strong> Cette classe est disponible depuis la version 2.1 d’Android.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/04/nexus.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/04/nexus-180x300.png" alt="" width="180" height="300" class="aligncenter size-medium wp-image-969" /></a></p>
<p><span id="more-939"></span></p>
<h2>Mon premier Live Wallpaper</h2>
<p>Le but est de créer un live wallpaper contenant une image qui se déplace aléatoirement, cette image pourra aussi être déplacé en touchant l&#8217;écran.</p>
<p>Pour commencer, nous allons créer un nouveau projet Android qu’on nommera:«<strong>MyLiveWallpaper</strong>». Le projet possédera les propriétés suivantes :</p>
<ul>
<li>Version du SDK : 2.3</li>
<li>Application Name : My First Live Wallpaper</li>
<li>Package Name : com.tuto.android</li>
<li>Min SDK version : 10</li>
<li>Décocher la cache : Create Activity</li>
</ul>
<div>
<p>On va tout d’abord créer dans le dossier res/xml un fichier «mywallpaper.xml» qui servira à décrire le wallpaper :</p>
<pre class="brush: java; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;wallpaper 
	xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:thumbnail=&quot;@drawable/android&quot;
	android:description=&quot;@string/wallpaper_description&quot;/&gt;
</pre>
<p><strong>android:description</strong> et <strong>android:thumbnail</strong> permettent d’affecter respectivement une description et une image à votre wallpaper. Cette description est disponible lors de la selection du wallpaper par l&#8217;utilisateur.</p>
<p>Maintenant nous allons créer une classe <strong>«MyLiveWallpaper»</strong> qui hérite de la classe <strong>«WallpaperService»</strong>, puis on va surcharger la méthode <strong>onCreateEngine()</strong> qui retourne une instance de la classe <strong>«Engine<strong>»</strong></strong><strong></strong>, cet instance gère : </p>
<ul>
<li>Le dessin,</li>
<li>Les animations,</li>
<li>Le cycle de vie,</li>
<li>L’interaction utilisateur.</li>
</ul>
<pre class="brush: java; title: ; notranslate">
public class MyLiveWallpaper extends WallpaperService {
	@Override
	public Engine onCreateEngine() {
		return new LiveWallpaperEngine();
	}
}
</pre>
<p>Une fois cette étape effectuée, on crée une classe membre <strong>«</strong><strong>LiveWallpaperEngine</strong><strong>»</strong> qui étend la classe <strong>«Engine»</strong> puis on surcharge ses méthodes comme ci-dessous:</p>
<pre class="brush: java; title: ; notranslate">
private class LiveWallpaperEngine extends Engine {

	private final Handler handler = new Handler();
	private final Runnable drawer = new Runnable() {
		@Override
		public void run() {
			draw();
		}
	};

	private boolean visible = true;
	private int width;
	private int height;

	public LiveWallpaperEngine() {
		handler.post(drawer);
	}

	@Override
	public void onCreate(SurfaceHolder surfaceHolder) {
	    super.onCreate(surfaceHolder);
	    setTouchEventsEnabled(true);
	}

	@Override
	public void onDestroy() {
	    super.onDestroy();
	    handler.removeCallbacks(drawer);
	}

	@Override
	public void onSurfaceCreated(SurfaceHolder holder) {
		super.onSurfaceCreated(holder);
	}

	@Override
	public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		this.width = width;
		this.height = height;
		super.onSurfaceChanged(holder, format, width, height);
	}

	@Override
	public void onSurfaceDestroyed(SurfaceHolder holder) {
		super.onSurfaceDestroyed(holder);
		this.visible = false;
		handler.removeCallbacks(drawer);
	}

	@Override
	public void onVisibilityChanged(boolean visible) {
		this.visible = visible;
		if (visible) {
			handler.post(drawer);
		} else {
			handler.removeCallbacks(drawer);
		}
	}

	@Override
	public void onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
	}
}
</pre>
<p>Passons à quelques explications :</p>
<ul>
<li>La méthode <strong>onCreate(SurfaceHolder surfaceHolder) </strong>initialise l’engine et active en même temps les évènements tactile via la méthode <strong>setTouchEventsEnabled(true)</strong>.</li>
<li>La méthode <strong>onDestroy()</strong> : Après l’appel à cette méthode, l’engine n’est plus valide.</li>
<li>La méthode <strong>onSurfaceCreated(SurfaceHolder holder)</strong> est appelé quand la surface de dessin est créée.</li>
<li>La méthode <strong>onSurfaceChanged(SurfaceHolder holder, int format, int width, int height)</strong> est appelé quand  la surface de dessin subit un changement.</li>
<li>La méthode <strong>onSurfaceDestroyd(SurfaceHolder holder)</strong> est appelé quand la surface de dessin est détruite.</li>
<li>La méthode <strong>onVisibilityChanged(boolean visible)</strong> nous permet de savoir si le wallpaper est visible ou non. Quand le wallpaper est visible, le dessin continu de s&#8217;effectuer sur le fond d&#8217;écran. Si une application passe en foreground le dessin s’arrête, cela permet d’économiser la batterie et minimiser l’impact du wallpaper sur les performances du système.</li>
<li>La méthode <strong>onTouchEvent(MotionEvent event)</strong> gère l’interaction utilisateur avec le wallpaper.
<li>
<p>Un live wallpaper a un contenu dynamique, ce qui permet d’avoir des animations. C’est donc à vous de gérer les différentes étapes de dessin sur le wallpaper. Pour cela, on utilise les deux classes <strong>Runnable</strong> et <strong>Handler</strong>. </p>
<p>Le handler envoi le runnable (ici <strong>drawer</strong>) dans le <strong>messageQueue</strong> associé à l’UI Thread afin qu&#8217;il soit exécuté. Ce runnable se charge de dessiner sur le wallpaper grâce à la méthode <strong>draw()</strong> qu’on expliquera plus tard. Répéter plusieurs fois ce mécanisme nous permet d’avoir une animation.</p>
<p>Quand le wallpaper doit s’arrêter, la variable <strong>visible</strong> (qui stocke la visibilité actuelle du wallpaper) passe à <strong>false</strong> dans les méthodes <strong>onSurfaceDestroyed()</strong><strong> </strong>et <strong> </strong><strong>onVisibilityChanged() </strong>ce qui stoppera l’animation (méthode <strong>handler.removeCallbacks(drawer).)</strong></p>
<p>Quand le wallpaper devient visible, la variable <strong>visible</strong> passe à <strong>true</strong> dans la méthode <strong> </strong><strong>onVisibilityChanged() </strong>, ce qui relance l’animation du wallpaper (méthode <strong> </strong><strong>handler.post(drawer).)</strong></p>
<p>Voyons maintenant comment on dessine sur le wallpaper, la méthode facilitant cette opération est la méthode <strong>draw()</strong> : </p>
<pre class="brush: java; title: ; notranslate">
private void draw() {
	SurfaceHolder holder = getSurfaceHolder();
	Canvas canvas = null;
	try {
		canvas = holder.lockCanvas();
		if (canvas != null) {
			float x = (width * random.nextFloat());
			float y = (height * random.nextFloat());
			drawImage(canvas, x, y);
		}
	} finally {
		if (canvas != null)
			holder.unlockCanvasAndPost(canvas);
	}
	handler.removeCallbacks(drawer);
	if (visible) {
		//On re-poste le runnable après un petit laps de temps
		handler.postDelayed(drawer, 4000);
	}
}</pre>
<p>La méthode qui permet de dessiner l&#8217;image dans le canvas est décrite ci-dessous :</p>
<pre class="brush: java; title: ; notranslate">
private void drawImage(Canvas canvas, float x, float y) {
	canvas.drawColor(Color.WHITE);
	canvas.drawBitmap(androidPic, x-(androidPic.getWidth()/2), y-(androidPic.getHeight()/2), null);
}
</pre>
<p>Sans oublier de déclarer la variable qui représente l’image qu’on veut dessiner :</p>
<pre class="brush: java; title: ; notranslate">
Bitmap androidPic = BitmapFactory.decodeResource(getResources(), R.drawable.android);
</pre>
<p><strong>Explications :</strong></p>
<p>Nous avons utilisé un <strong>Canvas</strong>, ce qui nous permet de dessiner de manière répétitive sur la <strong>Surface</strong> du wallpaper. Cette surface est fournie par la classe <strong>« SurfaceView »</strong>.</p>
<p>Afin de manipuler cette surface on utilise l’interface <strong>SurfaceHolder</strong>. On obtient le canvas grace à la méthode <strong>lockCanvas()</strong>, puis on dessine sur un point du canvas avec la méthode <strong>drawImage()</strong>.Ce point est obtenu aléatoirement grâce à ses coordonnés (x,y). </p>
<p>Enfin la méthode <strong>unlockCanvasAndPost(canvas) </strong>est appelé<strong> </strong>pour que le canvas soit déssiné sur la surface du wallpaper.</p>
<h2>Gestion des événements tactiles :</h2>
<p>Cela se fait grâce à la méthode <strong>onTouchEvent(MotioEvent event)</strong>, cette méthode posséde le même comportement que la méthode <strong>draw()</strong>, sauf que cette fois les coordonnées du point où s&#8217;effectue le dessin sont obtenus à l’endroit ou l&#8217;interaction utilisateur est effectuée.</p>
<pre class="brush: java; title: ; notranslate">
@Override
public void onTouchEvent(MotionEvent event) {
	float X = event.getX();
	float Y = event.getY();
	SurfaceHolder holder = getSurfaceHolder();
	Canvas canvas = null;
	try {
		canvas = holder.lockCanvas();
		if (canvas != null) {
			canvas.drawColor(Color.WHITE);
			drawImage(canvas, X, Y);
		}
	} finally {
		if (canvas != null)
			holder.unlockCanvasAndPost(canvas);
	}
	handler.removeCallbacks(drawer);
	if (visible) {
		handler.postDelayed(drawer, 4000);
	}
	super.onTouchEvent(event);
}
</pre>
<p>Ce qui donnera :</p>
<pre class="brush: java; title: ; notranslate">import java.util.Random;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class MyLiveWallpaper extends WallpaperService {

	private static Random random =  new Random() ;

	@Override
	public Engine onCreateEngine() {
		return new LiveWallpaperEngine();
	}

	private class LiveWallpaperEngine extends Engine {

		private final Handler handler = new Handler();
		private final Runnable drawer = new Runnable() {
			@Override
			public void run() {
				draw();
			}
		};

		private boolean visible = true;
		private int width;
		private int height;
		Bitmap androidPic = BitmapFactory.decodeResource(getResources(), R.drawable.android);

		public LiveWallpaperEngine() {
			handler.post(drawer);
		}

		@Override
	    public void onCreate(SurfaceHolder surfaceHolder) {
	        super.onCreate(surfaceHolder);
	        setTouchEventsEnabled(true);
	        }

	    @Override
	    public void onDestroy() {
	        super.onDestroy();
	        handler.removeCallbacks(drawer);
	    }

		@Override
		public void onSurfaceCreated(SurfaceHolder holder) {
			super.onSurfaceCreated(holder);
		}

		@Override
		public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			this.width = width;
			this.height = height;
			super.onSurfaceChanged(holder, format, width, height);
		}

		@Override
		public void onSurfaceDestroyed(SurfaceHolder holder) {
			super.onSurfaceDestroyed(holder);
			this.visible = false;
			handler.removeCallbacks(drawer);
		}

		@Override
		public void onVisibilityChanged(boolean visible) {
			this.visible = visible;
			if (visible) {
				handler.post(drawer);
			} else {
				handler.removeCallbacks(drawer);
			}
		}

		@Override
		public void onTouchEvent(MotionEvent event) {
			float X = event.getX();
			float Y = event.getY();
			SurfaceHolder holder = getSurfaceHolder();
			Canvas canvas = null;
			try {
				canvas = holder.lockCanvas();
				if (canvas != null) {
					canvas.drawColor(Color.WHITE);
					drawImage(canvas, X, Y);
				}
			} finally {
				if (canvas != null)
					holder.unlockCanvasAndPost(canvas);
			}
			handler.removeCallbacks(drawer);
			if (visible) {
				handler.postDelayed(drawer, 4000);
			}
			super.onTouchEvent(event);
		}

		private void draw() {
			SurfaceHolder holder = getSurfaceHolder();
			Canvas canvas = null;
			try {
				canvas = holder.lockCanvas();
				if (canvas != null) {
					float x = (width * random.nextFloat());
					float y = (height * random.nextFloat());
					drawImage(canvas, x, y);
				}
			} finally {
				if (canvas != null)
					holder.unlockCanvasAndPost(canvas);
			}
			handler.removeCallbacks(drawer);
			if (visible) {
				//On re-poste le runnable après un petit laps de temps
				handler.postDelayed(drawer, 4000);
			}
		}

		// Permet de dessiner l'image dans le canvas
		private void drawImage(Canvas canvas, float x, float y) {
			canvas.drawColor(Color.WHITE);
			canvas.drawBitmap(androidPic, x-(androidPic.getWidth()/2), y-(androidPic.getHeight()/2), null);
		}
	}
}</pre>
<p>Dernière étape, on déclare notre service dans l’<strong>AndroidManifest.xml </strong>avec l’action <strong>« </strong><strong>android.service.wallpaper.WallpaperService »</strong> et la permission <strong>« android.permission.BIND_WALLPAPER »</strong> qui autorise l’utilisation du Live Wallpaper.<br />
Notons aussi l’ajout de la balise <strong>uses-feature</strong> , qui indique à Google Play que votre application contient un Live Wallpaper, pour que celle–ci soit visible qu’aux utilisateurs ayant un device supportant les live wallpapers.</p>
<pre class="brush: java; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;com.tuto.android&quot;
    android:versionCode=&quot;1&quot;
    android:versionName=&quot;1.0&quot; &gt;

    &lt;uses-sdk android:minSdkVersion=&quot;10&quot; /&gt;
    &lt;uses-feature android:name=&quot;android.software.live_wallpaper&quot;&gt;&lt;/uses-feature&gt;

    &lt;application
        android:label=&quot;@string/app_name&quot;
        android:icon=&quot;@drawable/ic_launcher&quot; &gt;
        
        &lt;service 
            android:label=&quot;@string/my_live_wallpaper&quot;
            android:name=&quot;.MyLiveWallpaper&quot;
			android:permission=&quot;android.permission.BIND_WALLPAPER&quot;&gt;
			&lt;intent-filter&gt;
				&lt;action android:name=&quot;android.service.wallpaper.WallpaperService&quot;&gt;&lt;/action&gt;
			&lt;/intent-filter&gt;
			&lt;meta-data android:name=&quot;android.service.wallpaper&quot;
				android:resource=&quot;@xml/mywallpaper&quot;&gt;&lt;/meta-data&gt;
		&lt;/service&gt;
    &lt;/application&gt;

&lt;/manifest&gt;
</pre>
<p>Sans oublier le <strong>String.xml</strong> :</p>
<pre class="brush: java; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;resources&gt;

    &lt;string name=&quot;app_name&quot;&gt;Live Wallpaper&lt;/string&gt;
    &lt;string name=&quot;my_live_wallpaper&quot;&gt;My Live Wallpaper&lt;/string&gt;
    &lt;string name=&quot;wallpaper_description&quot;&gt;My first live wallpaper&lt;/string&gt; 

&lt;/resources&gt;</pre>
<h2>Remarque :</h2>
<p>Pour gérer les préférences de votre wallepaper, créez une <strong>PréférenceActivity</strong> qui permettra de définir les configurations de votre fond d&#8217;écran. La récupération des valeurs de vos préférences s&#8217;effectue à l&#8217;aide des <strong>SharedPreference</strong>. Pour cela, ajoutez les lignes suivantes à votre « wallpaper.xml »: </p>
<pre class="brush: java; title: ; notranslate">&lt;android:settingsActivity=&quot;MyPreferenceActivity&quot;/&gt;</pre>
<p>sans oublier de déclarer votre activité dans l’AndroidManifest.xml.</p>
<p>Lancez maintenant votre application, sélectionnez le Live Wallpaper que vous avez créé afin d&#8217;obtenir le résultat suivant :</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/04/screen1.png"><img class="aligncenter size-full wp-image-941" src="http://www.tutos-android.com/wp-content/uploads/2012/04/screen1.png" alt="" width="269" height="442" /></a></p>
<h2>Conclusion</h2>
<p>Voila, j’espère que cet article vous à permis de mieux comprendre comment fonctionnent les live wallpapers,le code du projet est disponible <a href="http://www.tutos-android.com/wp-content/uploads/2012/04/Live-Wall1.zip" target="_blank">ici</a>.<br />
Maintenant place à votre imagination pour créer vos propre fond d’écran animés.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/creer-live-wallpaper-fond-ecran-android/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/creer-live-wallpaper-fond-ecran-android</feedburner:origLink></item>
		<item>
		<title>ViewPager sous Android : Comment slider d’un fragment à un autre</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/DbNSkaw8B7k/fragment-slider-page-lautre</link>
		<comments>http://www.tutos-android.com/fragment-slider-page-lautre#comments</comments>
		<pubDate>Wed, 25 Apr 2012 19:32:36 +0000</pubDate>
		<dc:creator>Arnaud Bossmann</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[adapter android]]></category>
		<category><![CDATA[comptability package]]></category>
		<category><![CDATA[comptability package android]]></category>
		<category><![CDATA[fragment]]></category>
		<category><![CDATA[fragment android]]></category>
		<category><![CDATA[FragmentActivity]]></category>
		<category><![CDATA[FragmentActivity android]]></category>
		<category><![CDATA[FragmentManager]]></category>
		<category><![CDATA[FragmentManager android]]></category>
		<category><![CDATA[FragmentPagerAdapter]]></category>
		<category><![CDATA[FragmentPagerAdapter android]]></category>
		<category><![CDATA[fragments tutoriel]]></category>
		<category><![CDATA[inflate]]></category>
		<category><![CDATA[inflate android]]></category>
		<category><![CDATA[inflater]]></category>
		<category><![CDATA[inflater android]]></category>
		<category><![CDATA[page viewer android]]></category>
		<category><![CDATA[PagerAdapter]]></category>
		<category><![CDATA[PagerAdapter android]]></category>
		<category><![CDATA[slider androidmarker]]></category>
		<category><![CDATA[TextView Android]]></category>
		<category><![CDATA[tuto fragment]]></category>
		<category><![CDATA[utiliser les fragments]]></category>
		<category><![CDATA[ViewPager android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=864</guid>
		<description><![CDATA[Nous revoici pour un nouveau tutoriel, le premier à aborder la notion de Fragment. Les Fragments ont été introduits dans la version Android 3.0 (également utilisable avec des versions antérieures) avec pour objectif de permettre une plus grande flexibilité pour les écrans larges tel que les tablettes tactiles (ce que nous verrons dans un prochain [...]]]></description>
			<content:encoded><![CDATA[<p>Nous revoici pour un nouveau tutoriel, le premier à aborder la notion de <strong>Fragment</strong>. Les Fragments ont été introduits dans la version Android 3.0 (également utilisable avec des versions antérieures) avec pour objectif de permettre une plus grande flexibilité pour les écrans larges tel que les tablettes tactiles (ce que nous verrons dans un prochain tutoriel). Notre objectif aujourd&#8217;hui est simplement de créer un joli effet &#8220;slide&#8221; entre des pages.<br />
<span id="more-864"></span></p>
<h2><strong>Qu&#8217;est-ce qu&#8217;un Fragment ?</strong></h2>
<p>C&#8217;est certainement la question que vous devez vous poser. On peut voir un Fragment comme une &#8220;<strong>mini-Activity</strong>&#8221; ou une portion d&#8217;une activité qui ne peut pas vivre en dehors d&#8217;une Activity. Un des aspects pratiques du Fragment est qu&#8217;il peut être facilement réutilisé d&#8217;une Activity à l&#8217;autre.</p>
<h2><strong>Notre projet</strong></h2>
<p>Comme d&#8217;habitude, je vous invite à créer un projet dédié à ce tutoriel, que j&#8217;ai baptisé <strong>TutoFragment</strong>. Je l&#8217;ai volontairement créé pour la version Android 2.2 pour y intégrer le package de compatibilité, puisqu&#8217;à la base, les Fragments viennent sont une fonctionnalité de la version 3.0.<br />
Nous allons donc premièrement télécharger la librairie complémentaire. Pour cela, allez dans le SDK Manager en cliquant sur l&#8217;icône suivante et télécharger &#8220;Android Support&#8221;.</p>
<p><img src="http://www.tutos-android.com/wp-content/uploads/2012/04/SDK_manager.png" alt="sdk_manager" /></p>
<p>Ajoutons ensuite cette librairie au projet. Pour cela, sélectionnez votre projet sous Eclipse, <strong>clic droit/Android tools/Add support library</strong>. La librairie s&#8217;intègre automatiquement au projet, ce qui nous permet d&#8217;utiliser la classe Fragment !</p>
<h2><strong>Les fichiers xml</strong></h2>
<p>Le layout principal, que j&#8217;ai renommé <strong>viewpager.xml</strong>, se présente de la manière suivante:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

&lt;android.support.v4.view.ViewPager
	xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;fill_parent&quot;
	android:id=&quot;@+id/viewpager&quot;&gt;
&lt;/android.support.v4.view.ViewPager&gt;

</pre>
<p>La balise du composant utilisé ici a une syntaxe particulière puisqu&#8217;elle fait référence à un composant de la librairie ajoutée précédemment.</p>
<p>Les trois autres layouts seront les pages affichées successivement lors du slide et possèdent un code similaires. Voici le code de <strong>page_gauche_layout.xml</strong>, je vous laisse créer les deux autres par vous même (<strong>page_milieu_layout </strong>et <strong>page_droite_layout</strong>).</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:orientation=&quot;vertical&quot; &gt;


    &lt;TextView
        android:id=&quot;@+id/textView1&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center&quot;
        android:layout_margin=&quot;20dp&quot;
        android:text=&quot;Page de gauche&quot; /&gt;

&lt;/LinearLayout&gt;
</pre>
<h2><strong>Le code Java</strong></h2>
<p>J&#8217;ai renommé la classe principale en <strong>FragmentsSliderActivity</strong>. Celle-ci dérive de la classe <strong>FragmentActivity</strong> qui est simplement une Activity permettant de gérer les Fragments. Le code est commenté, je vous laisse regarder.</p>
<pre class="brush: java; title: ; notranslate">import java.util.List;
import java.util.Vector;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;

public class FragmentsSliderActivity extends FragmentActivity {

	private PagerAdapter mPagerAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.viewpager);

		// Création de la liste de Fragments que fera défiler le PagerAdapter
		List fragments = new Vector();

		// Ajout des Fragments dans la liste
		fragments.add(Fragment.instantiate(this,PageGaucheFragment.class.getName()));
		fragments.add(Fragment.instantiate(this,PageMilieuFragment.class.getName()));
		fragments.add(Fragment.instantiate(this,PageDroiteFragment.class.getName()));

		// Création de l'adapter qui s'occupera de l'affichage de la liste de
		// Fragments
		this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);

		ViewPager pager = (ViewPager) super.findViewById(R.id.viewpager);
		// Affectation de l'adapter au ViewPager
		pager.setAdapter(this.mPagerAdapter);
	}
}</pre>
<p>Pour passer d&#8217;une page à une autre, nous avons besoin d&#8217;un adapter (à la manière des ListView). L&#8217;adapter, appelé <strong>MyPagerAdapter</strong> dérive de <strong>FragmentPagerAdapter</strong>. Rien de compliqué, il fonctionne sur le même principe que les Adapters de ListViews.</p>
<pre class="brush: java; title: ; notranslate">import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyPagerAdapter extends FragmentPagerAdapter {

	private final List fragments;

	//On fournit à l'adapter la liste des fragments à afficher
	public MyPagerAdapter(FragmentManager fm, List fragments) {
		super(fm);
		this.fragments = fragments;
	}

	@Override
	public Fragment getItem(int position) {
		return this.fragments.get(position);
	}

	@Override
	public int getCount() {
		return this.fragments.size();
	}
}</pre>
<p>Enfin, la classe <strong>PageGaucheFragment</strong>, qui dérive de la classe <strong>Fragment</strong> possède des méthodes différentes de la classe Activity.</p>
<p>Ici, nous allons surcharger la méthode <strong>onCreateView</strong>. Cette méthode retourne un type <strong>View</strong>, on va donc lui indiquer notre layout par le biais de l&#8217;inflater. Les classes <strong>PageMilieuFragment </strong>et <strong>PageDroiteFragment </strong>sont quasi-identiques, je vous laisse vous en occuper.</p>
<pre class="brush: java; title: ; notranslate">import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class PageGaucheFragment extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.page_gauche_layout, container, false);
	}
}</pre>
<p>Rendu final:<br />
<img src="http://www.tutos-android.com/wp-content/uploads/2012/04/ViewPager1.png" alt="page 1" /><img src="http://www.tutos-android.com/wp-content/uploads/2012/04/ViewPager2.png" alt="page 2" /><img src="http://www.tutos-android.com/wp-content/uploads/2012/04/ViewPager3.png" alt="page 2" /></p>
<h2><strong>Conclusion</strong></h2>
<p>Ainsi se termine notre premier tutoriel sur les Fragments, en espérant que tout soit clair. Vous pouvez trouver le code source <a title="TutoFragment.zip" href="http://www.tutos-android.com/wp-content/uploads/2012/04/TutoFragments.zip">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/fragment-slider-page-lautre/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/fragment-slider-page-lautre</feedburner:origLink></item>
		<item>
		<title>Les AsyncTask</title>
		<link>http://feedproxy.google.com/~r/Tutos_Android/~3/MNK8Vply6Ec/asynctask-android-traitement-asynchrone-background</link>
		<comments>http://www.tutos-android.com/asynctask-android-traitement-asynchrone-background#comments</comments>
		<pubDate>Tue, 27 Mar 2012 19:24:55 +0000</pubDate>
		<dc:creator>Arnaud Bossmann</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[asynchrone android]]></category>
		<category><![CDATA[AsyncTask android]]></category>
		<category><![CDATA[barre de progression android]]></category>
		<category><![CDATA[barre de progression horizontale android]]></category>
		<category><![CDATA[Bouton android]]></category>
		<category><![CDATA[Button Android]]></category>
		<category><![CDATA[calcul asynchrone android]]></category>
		<category><![CDATA[calcul background android]]></category>
		<category><![CDATA[calcul en tâche de fond android]]></category>
		<category><![CDATA[doInBackground android]]></category>
		<category><![CDATA[execute android]]></category>
		<category><![CDATA[extends AsyncTask]]></category>
		<category><![CDATA[extends AsyncTask android]]></category>
		<category><![CDATA[findViewById Android]]></category>
		<category><![CDATA[OnClickListener Android]]></category>
		<category><![CDATA[onPostExecute android]]></category>
		<category><![CDATA[onPreExecute android]]></category>
		<category><![CDATA[onProgressUpdated android]]></category>
		<category><![CDATA[progressbar android]]></category>
		<category><![CDATA[progressbar horizontale android]]></category>
		<category><![CDATA[Progression android]]></category>
		<category><![CDATA[publishProgress android]]></category>
		<category><![CDATA[setProgress android]]></category>
		<category><![CDATA[tâche asynchrone android]]></category>
		<category><![CDATA[tâche background android]]></category>
		<category><![CDATA[tâche de fond android]]></category>
		<category><![CDATA[texte android]]></category>
		<category><![CDATA[TextView Android]]></category>
		<category><![CDATA[Thread android]]></category>
		<category><![CDATA[UIThread android]]></category>

		<guid isPermaLink="false">http://www.tutos-android.com/?p=834</guid>
		<description><![CDATA[Bonjour chers amis développeurs Android ! Aujourd’hui nous allons voir comment fonctionne la classe AsyncTask. Comme son nom l’indique, une AsyncTask permet de réaliser des tâches de manière asynchrone, à la manière de la classe Thread. L’avantage de l’AsyncTask est sa simplicité d&#8217;utilisation et d&#8217;implémentation. Le Thread secondaire est créé automatiquement et la communication entre [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour chers amis développeurs Android ! Aujourd’hui nous allons voir comment fonctionne la classe <strong>AsyncTask</strong>.</p>
<p>Comme son nom l’indique, une <strong>AsyncTask</strong> permet de réaliser des tâches de manière asynchrone, à la manière de la classe <strong>Thread</strong>. L’avantage de l’AsyncTask est sa simplicité d&#8217;utilisation et d&#8217;implémentation. Le Thread secondaire est créé automatiquement et la communication entre les différents Thread est simplifiée.</p>
<p><span id="more-834"></span></p>
<p>Lors du développement d’une application, il faut bien avoir en tête que toutes les tâches consommatrices de ressources (requêtes http, calculs lourds, …) doivent se faire dans un Thread séparé. En effet, le système affiche un message d’erreur et ferme l’application lorsque le Thread principal (appelé <strong>UI Thread</strong>) est bloqué trop longtemps.</p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/03/anr.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/03/anr-300x204.png" alt="" title="anr" width="300" height="204" class="aligncenter size-medium wp-image-849" /></a></p>
<h2><strong>Mise en place du projet</strong></h2>
<p>Nous allons donc d’abord créer un nouveau projet appelé <strong><em>AsyncBigCalcul</em></strong>. Nous allons faire en sorte d’effectuer un traitement long de manière asynchrone.<br />
Premièrement, nous allons modifier le layout <strong>main.xml</strong> en lui ajoutant un Button et une ProgressBar. Le premier servira à lancer le traitement ; la seconde à afficher la progression du traitement.<br />
Voici le code XML, rien de difficile.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;fill_parent&quot;
    android:orientation=&quot;vertical&quot; &gt;

    &lt;Button
        android:layout_marginTop=&quot;10dp&quot;
        android:id=&quot;@+id/btnLaunch&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;Lancer la tâche&quot; /&gt;
    
    &lt;TextView        
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center&quot;
        android:text=&quot;Progression de la tâche asynchrone:&quot; /&gt;

    &lt;ProgressBar
        android:id=&quot;@+id/pBAsync&quot;
        style=&quot;?android:attr/progressBarStyleHorizontal&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_margin=&quot;10dp&quot;
        android:layout_height=&quot;wrap_content&quot; /&gt;    

&lt;/LinearLayout&gt;
</pre>
<h2><strong>L’activité principale</strong></h2>
<p>Nous allons d’abord récupérer les composants définis dans le layout puis ajouter un listener sur le bouton afin qu’à chaque appui on exécute une nouvelle instance de BigCalcul. Jusque là, rien de bien compliqué encore une fois.</p>
<pre class="brush: java; title: ; notranslate">
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

public class AsyncBigCalculActivity extends Activity {

	private ProgressBar mProgressBar;
	private Button mButton;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// On récupère les composants de notre layout
		mProgressBar = (ProgressBar) findViewById(R.id.pBAsync);
		mButton = (Button) findViewById(R.id.btnLaunch);

		// On met un Listener sur le bouton
		mButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				BigCalcul calcul=new BigCalcul();
				calcul.execute();
			}
		});
	}
}
</pre>
<h2><strong>La classe BigCalcul</strong></h2>
<p>Passons ensuite à l’écriture de notre classe BigCalcul, qui hérite d’AsyncTask. Ici je l’ai mise en classe privée mais c’est possible de l’écrire à part. Je vous laisse admirer (et essayer de comprendre) le code :</p>
<pre class="brush: java; title: ; notranslate">
private class BigCalcul extends AsyncTask&lt;Void, Integer, Void&gt;
{

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Toast.makeText(getApplicationContext(), &quot;Début du traitement asynchrone&quot;, Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onProgressUpdate(Integer... values){
		super.onProgressUpdate(values);
		// Mise à jour de la ProgressBar
		mProgressBar.setProgress(values[0]);
	}

	@Override
	protected Void doInBackground(Void... arg0) {

		int progress;
		for (progress=0;progress&lt;=100;progress++)
		{
			for (int i=0; i&lt;1000000; i++){}
			//la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate
			publishProgress(progress);
			progress++;				
		}	
		return null;
	}

	@Override
	protected void onPostExecute(Void result) {
		Toast.makeText(getApplicationContext(), &quot;Le traitement asynchrone est terminé&quot;, Toast.LENGTH_LONG).show();
	}
}
</pre>
<p><span style="text-decoration: underline"><strong>Explications :</strong></span><br />
Les trois paramètres attendus lors de la déclaration sont des types génériques dont voici la signification :</p>
<ul>
<li>Le premier est le type des paramètres fournis à la tâche</li>
<li>Le second est le type de données transmises durant la progression du traitement</li>
<li>Enfin le troisième est le type du résultat de la tâche</li>
</ul>
<p>Une AsyncTask doit obligatoirement implémenter la méthode <strong>doInBackground</strong>. C’est elle qui réalisera le traitement de manière asynchrone dans un Thread séparé. Les méthodes <strong>onPreExecute</strong> (appelée avant le traitement), <strong>onProgressUpdate</strong> (appelée lorsque vous souhaitez afficher sa progression) et <strong>onPostExecute</strong> (appelée après le traitement) sont optionnelles. Un appel à la méthode <strong>publishProgress</strong> permet la mise à jour de la progression. On ne doit pas appeler la méthode onProgressUpdate directement.</p>
<p><span style="text-decoration: underline"><strong>NOTE</strong></span>: Attention, ces trois méthodes (onPreExecute, onProgressUpdate et onPostExecute) s’exécutent depuis l’<strong>UI Thread</strong> ! C’est d’ailleurs grâce à cela qu’elles peuvent modifier l’interface. On ne doit donc pas y effectuer de traitements lourds.</p>
<p>Ce qui donnera :<br />
<a href="http://www.tutos-android.com/wp-content/uploads/2012/03/img_start.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/03/img_start-188x300.png" alt="" title="img_start" width="188" height="300" class="aligncenter size-medium wp-image-851" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/03/img_progress.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/03/img_progress-188x300.png" alt="" title="img_progress" width="188" height="300" class="aligncenter size-medium wp-image-852" /></a></p>
<p><a href="http://www.tutos-android.com/wp-content/uploads/2012/03/img_end.png"><img src="http://www.tutos-android.com/wp-content/uploads/2012/03/img_end-187x300.png" alt="" title="img_end" width="187" height="300" class="aligncenter size-medium wp-image-853" /></a></p>
<p>Le code me parait assez clair donc je ne détaille pas plus. Vous remarquerez juste que le soi-disant BigCalcul n’est en fait qu’une grosse boucle, ça me paraissait plus lisible.</p>
<p>Voilà, j’espère que les AsyncTask n’ont plus de secret pour vous à présent ! N’hésitez pas à poser des questions si vous avez des difficultés d’implémentation. Le code source de l&#8217;exemple est disponible <a href="http://www.tutos-android.com/wp-content/uploads/2012/03/AsyncBigCalcul.zip">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tutos-android.com/asynctask-android-traitement-asynchrone-background/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		<feedburner:origLink>http://www.tutos-android.com/asynctask-android-traitement-asynchrone-background</feedburner:origLink></item>
	</channel>
</rss>
