Après un petit moment d’inactivité, Cyril Mottier revient et continue sa série de tutoriaux sur le développement sous Android. Pour faire suite à un “Hello World” un peu atypique, il aborde un système important et même essentiel à Android : les Intents.
Android offre un système de communication trés ingénieux permettant de faire passer l’information entre Activitys ou plus généralement composants applicatifs . Ce système, déjà mentionné dans une partie précédente, est connu sous le nom d’Intent. Nous verrons donc dans cette partie comment transmettre l’information d’une Activity à une autre à l’aide de ce mécanisme d’Intents. Les lecteurs n’ayant toujours pas compris la différence subtile entre Activity et View seront probablement éclairé par la lecture des lignes suivantes.
Android sandbox les applications. Le mot “sandbox” est un anglicisme qui signifie simplement “bac à sable”. Il vous paraît très probablement étrange de parler de “bac à sable” dans un problème d’informatique mais c’est pourtant bel et bien la traduction adéquate dans le contexte. Le sandboxing est une pratique de plus en plus courante dans la téléphonie mobile qui consiste à séparer presque totalement les applications entre elles. Lorsque Android exécute une application, il restreint cette dernière à des actions bien définies (accès mémoire, accès sur les capteurs, etc…). Cette pratique permet de protéger le système au maximum en évitant de laisser des applications faire comme bon leurs semble.
Malgré l’énorme apport sur la sécurité, le sandoxing restreint fortement la communication entre applications. C’est dans l’optique de contourner ce “problème”, que les Intents ont été conçus. Pour faire simple, un Intent est un ensemble de données qui peut être passé à un autre composant applicatif (de la même application ou non) de façon implicite (requête pour une action – lire de la musique ou scanner un code barre par exemple) ou explicite (lancement d’une classe précise).
Le développement sur iPhone suit également cette règle de “sandboxing”. Malheureusement le système de communication entre application appelé “URL scheme” est beaucoup moins évolutif et permissif. Ce dernier consiste simplement à enregistrer l’application auprès du système qui laissera alors les applications démarrer l’application pour une URI (sous Safari par exemple). Cela montre très clairement l’avantage d’Android sur l’iPhone en matière de communication entre composants applicatifs. De plus, ce qui est faisable avec l’iPhone l’est très souvent sous Android – et inversement.
Activity grâce aux IntentsPour bien décrire le système des Intents, nous allons créer une petite application (sans aucun but réel, je l’accorde) composée de 2 écrans : le premier dispose d’un bouton permettant de démarrer une nouvelle Activity de façon explicite. La seconde Activity affichera simplement un champ de recherche permettant d’effectuer une recherche sur Google. Le code de cette application est disponible dans ce dossier zippé.
Pour commencer, créons une première Activity qui affichera un unique bouton central. Le code XML ci-dessous est composé d’une unique balise Button. Cette simplicité de l’interface graphique provient du fait que l’espace disponible au développeur pour afficher son application (l’intégralité de l’écran moins la barre de tâches et la barre de nom) est disponible sous la forme d’un FrameLayout. L’image ci-dessous montre la hiérarchie des vues générées avec ce fichier XML. On aperçoit facilement (en bleu) un FrameLayout.

Les paramètres android:layout_gravity="center" et android:text="Cliquez ici pour démarrer" permettent respectivement de centrer le bouton dans sa vue parente et de définir le texte du bouton.
<?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Cliquez ici pour démarrer" />
Notre interface graphique étant prête, il suffit maintenant de créer notre première Activity. Pour faciliter la compréhension, j’ai préféré directement commenter le code. N’oubliez pas d’inclure cette nouvelle Activity dans le fichier Manifest.xml pour qu’Android autorise son exécution.
package com.cyrilmottier.android.tutorial4; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; /* * La classe EntryPoint implémente l'interface View.OnClickListener. Cela permet ainsi * d'enregistrer l'activité auprès des vues pour qu'elle puiise recevoir les évènements de "clic". */ public class EntryPoint extends Activity implements View.OnClickListener { /* * Cette variable permettra de conserver une référence sur le bouton * de l'interface */ private Button mButton; /* * La redéfinition de la méthode onCreate(Bundle) permet d'effectuer des actions * supplémentaires à l'Activity de base. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* * On créé l'interface graphique en utilisant le fichier entry.xml. * Ce dernier étant disponible comme ressource (dans /res/layout), il suffit d'utiliser * le fichier R.java et sa sous-classe layout. */ setContentView(R.layout.entry); /* * Récupère une référence sur le bouton en utilisant son identifiant */ mButton = (Button)findViewById(R.id.button); /* * On enregistre l'activité auprès du bouton pour recevoir les évènements * "clic" provoqué par l'utilisateur. */ mButton.setOnClickListener(this); } /* * La méthode onClick(View) provient de l'interface View.OnClickListener. */ @Override public void onClick(View v) { if (v == mButton) { /* * Nous sommes maintenant sûr que la vue ayant été cliquée est le bouton * de notre interface. Il suffit donc de créer un nouvel Intent pour démarrer * la seconde activité. */ Intent intent = new Intent(EntryPoint.this, GoogleSearch.class); startActivity(intent); } } }
Notre première Activity est maintenant terminée. Le lancement d’une nouvelle Activity de façon explicite s’effectue en deux lignes. La première, Intent intent = new Intent(EntryPoint.this, GoogleSearch.class); crée simplement un nouvel Intent dont le contexte de départ est l’Activity courante (EntryPoint.this) et l’Activity de destination se nomme GoogleSearch.
Il ne nous reste maintenant plus qu’à définir l’Activity GoogleSearch en utilisant des principes similaires à ceux précédemment décrits. Commençons, tout d’abord par créer l’interface graphique :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="10px"> <TextView android:text="Entrez la recherche à effectuer dans le champ ci-dessous puis cliquez sur le bouton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10px" android:gravity="center_horizontal" /> <EditText android:id="@+id/editText" android:layout_marginBottom="5px" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ImageButton android:id="@+id/imageButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/logo_google" android:layout_gravity="center"></ImageButton> </LinearLayout>
Il ne me semble pas très important de décrire le fichier XML précédent car il peut être considéré comme classique. Il est à noter, tout de même, une légère différence avec les fichiers XML de notre HelloWorld : les ressources de type chaines de caractères, dimensions, etc. ne sont pas externalisés dans un fichier externe. Dans notre cas cela n’a pas réellement d’impact puisque nous n’allons pas internationaliser l’application.
package com.cyrilmottier.android.tutorial4; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; public class GoogleSearch extends Activity implements View.OnClickListener { private ImageButton mImageButton; private EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.google); mImageButton = (ImageButton)findViewById(R.id.imageButton); mEditText = (EditText)findViewById(R.id.editText); mImageButton.setOnClickListener(this); } @Override public void onClick(View view) { if (view == mImageButton) { final String requete = "http://www.google.fr/search?q=" + mEditText.getText(); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(requete)); startActivity(intent); } } }

Un clic sur le bouton “Google” créé un nouvel Intent à l’aide du constructeur Intent(String,Uri). La chaine de caractère passée en paramètre est une action à effectuer (ici ACTION_VIEW : action définie par le framework qui consiste à démarrer un navigateur web sur l’Uri donnée). On démarre enfin l’activité par un simple startActivity(Intent). Une action ne définissant pas une application en particulier, Android va tenter de chercher une application s’étant définie comme capable de répondre à l’action ACTION_VIEW. C’est cette “non certitude” sur l’application à ouvrir qui explique le nom de cette méthode : implicite. Généralement le navigateur utilisé est celui inclus de base dans le téléphone.
Les Intents sont des composants essentiels de l’architecture Android. Le démarrage explicite ou implicite d’une Activity à l’aide d’Intents n’est qu’une petite infime partie des possibilités de ce mécanisme. Cette partie fait donc office d’introduction aux Intents et vous permet de mieux comprendre la communication entre composants applicatifs Android. Vous êtes maintenant prêts à coder vos premiers programmes à écrans multiples !
Les commentaires ne sont pas modérés avant leur publication alors n'hésitez à vous exprimer librement.
Une seule règle : Rester un minimum poli et constructif.
Vous avez des questions d'ordre général à poser? Direction le forum.
41 commentaires sur "Tutoriel Android : Introduction aux Intents" :
Bonne explication,
ceci dit, il aurait egalement été interessant d’avoir une ligne en + pour voir aussi les parametres que l’on peut passer avec intent.putExtra
et la recuperation du coté de l’activity appelée.
Autre tutoriel à signaler sur le blog de la ssii Oxiane : http://blog.oxiane.com/2009/07.....a-android/
Peu connu mais constructif et bien fait
Sujet: ,
est ce que vous savez qu’elles sont APIs qui je peux utilisé pour faire une appli qui fait le trasfert ftp, Donwload, upload??
Merci pour votre aide
C urgent
Salut embensouda
Ta question n’a véritablement rien à voir avec ce tutorial mais je pense pouvoir y répondre sans trop de problème. Je crois que rien n’ai directement prévu pour le ftp sous Android. Néanmoins, avec des packages tels que java.net, certaines RFC et surtout un peu de courage tout est possible (c’est Android !)
dsl de le posté içi, je viens d’ouvri un sujet de discussion sur le forum.
quand vous dites rien n’est prevu sur android!! comment ca se passe alor le transfert de data et telechargement sur android ???$
vous pouvez me repondre sur le forum
Merci pour ton aide
Bonjour,
est-ce que quelqu’un veut bien me dire comment modifier Manifest.xml et quoi mettre dedans afin de faire marcher ce programme.
D’ailleurs, pour moi, le manifest est vraiment la partie la plus obscure d’Android. Autrement dit, j’y comprends pas grand chose…
@sangorys : explique un peu ton problème et on pourra peut être plus t’aider. Le projet fourni ici est normalement directement exécutable (avec Android 1.5 tout du moins).
Merci Cyril,
il est dit : “N’oubliez pas d’inclure cette nouvelle Activity dans le fichier Manifest.xml pour qu’Android autorise son exécution”.
Donc ma question est : Comment modifier Manifest.xml et quoi mettre dedans. Doit-on aussi déclarer les intents ?
Pour répondre à ta question, ce tutorial fait partie d’un suite de tutoriaux que j’ai rédigé. Il me semblait avoir déjà expliquer comment ajouter une Activity au AndroidManifest.xml
Pour rappel
:
l’AndroidManifest.xml c’est un clair LE fichier qui explique ce que ton application a le droit de faire (Permissions), ce qu’elle contient (Activity, Service, Content Provider, etc.) et plein de truc de ce genre. Ca fait un peu foure-tout mais c’est un fichier indispensable à une application Android.
Dans ton cas, si tu regarde du coté du code source d’AndroidManifest.xml tu devrais simplement avoir un bloc du genre :
Cela permet au système de savoir qu’il existe ce genre d’Activity qui peut être lancée.
Bon courage
Bonjour,
j’essye de faire la meme chose mais c’est avec l’API ” android.telphony.
cad, a traver une application j’essye de lancer des appels telephonique, est ce que vous pouvez me donner un peu de details sur comment faire le transfert de numero de mon appli vers le dialer de android, ou quelle classe je peux appler pr demarer le dialer…
merci pour votre aide
Salut embensouda
Le principe est exactement le même : il te suffit d’utiliser l’action ACTION_DIAL. Lorsqu’on utilise cette action, on démarre le Dialer qui s’affiche “vide” si rien n’est passé par setData(URI) sinon il affiche l’URI.
Un exemple : startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:0123456789″))); démarre le Dialer avec le numéro 0123456789
Encore une fois, la documentation pour ce genre d’action est disponible dans android.content.Intent.
Si je ne me trompe pas, il sera nécessaire que l’utilisateur valide l’appel. Si tu préfère que l’appel s’effectue de façon automatique utilise plutôt ACTION_CALL (sans oublier la persmission android.permission.CALL_PHONE).
Bon courage
mille merci.
mais je pense que je vais revenir vers toi pour plus de details, si ça t’embete pas bien sur
Je suis plus du genre “mettre les gens sur la bonne piste” … lorsqu’on programme sur Android, il faut vraiment savoir lire la documentation car c’est vraiment elle qui explique tout.
Mon rôle dans l’affaire n’est donc pas de faire votre travail mais simplement de vulgariser cette grosse documentation que Google fourni
Cyril,
j’ai essyer de refaire le tutorial mais j’ai une erreur au niveau de “@override”
Multiple markers at this line
- implements android.view.View.OnClickListener.onClick
- The method onClick(View) of type EntryPoint must override a superclass
Supprime simplement le @Override : il doit normalement être utilisé lorsque tu redéfinis la méthode or dans ton cas c’est simplement une interface que tu définis.
c’est ce que j’ai fait mais je voulais comprendre pour quoi??
Merci pour ton aide
Bonjour,
pour le num de tel, je n’ai pas envies qu’il soit figé, pour cela, j’ai fais pareil de ce qui est pour l’adresse web, mais le prob, c’est que a chaque fois il compose un num aleatoire sur le dialer .
voila le bout de code . Merci pour votre aide
public void onClick(View view) {
if (view == mImageButton) {
final String toDial=”tel:”+ mEditText.getText();
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(toDial)));
}
}
Bonjour,
j’ai suivi ton tuto, et la j utilise le parametre ACTION_CALL et j’aimerai le stopper apres un certain temps.
A -t il une fonction ou un parametre qui permet d’ arreter l’appel ou bout d’un temps T.?
OU l’idée est de le placer dans un Thread?
Merci de votre reponse.
Seb.
Si j’ai bien compris, tu aimerais stopper l’appel? Ne penses tu pas que c’est à l’utilisateur de faire ce genre d’action? Si tu souhaite vraiment arrêter l’Activity .. ce qui me parait vraiment inaproprié, utilise : finishActivity (mais il faut avoir démarrer l’activité avec startActivityForResult je crois)
Bonjour Cyril,
ce que je veux faire exactement :
-lancer l’appel avec ACTION_CALL, apres une durrée T (que je ne sais pas comment faire pour la fixer) je veux arreté l’appel.
le but c’est d’automatisé cette operation cad, avec un seul bouton je veux lancer l’appel et l’arreté apres un temps T, etc…
Merci pour ton aide
Eh bien avec ce que je t’ai donné et l’aide d’un Handler.postDelayed() ça devrait être possible :p
Merci, je vais tester ca.
Bonjour Cyril,
j’ai essyé ce que tu m’a expliqué,j’ai pas d’erreur, mais ca n’a pas l’air de marché.
excuse moi, je suis debutant coté Android.
voila le code que j’ai fais, si tu poura jeter un coup d’oil.
Intent intent =new Intent(Intent.ACTION_CALL, Uri.parse(toDial));
startActivityForResult(intent,-5);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run(){}}, 1000);
finishActivity (-5);
}
}
}
merci pour le tutorial. J’ai créé un projet androïd, et j’ai importé les fichiers du projet dont j’ai téléchargé les sources.
Mais bizarrement,
dans les deux classes java , j’ai une alerte sur la méthode onView et l’IDE eclipse me suggère d’enlever les annotations @Override.
Quand j’enlève, ça fonctionne mais je ne comprends pas pourquoi j’ai cette alerte.
merci.
C’est normal, cela dépend du JDK installé.
La véritable méthode est normalement de ne pas mettre l’annotation @Override lorsque les méthodes sont en fait des définition de méthode d’interface. L’annotation @Override ne doit être utilisée que lors de redéfinition de méthodes de classe mère.
Dans l’exemple, il faudrait enlever les annotations pour la méthode onClick(View v)
merci Cyril, on le met seulement si on redéfinit la fonction si j’ai compris.
Sinon question un peu HS, je suis content que ça a l’air de marcher sur l’émulateur , pour le mettre sur mon téléphone , as -tu écrit un article? je n’ai pas trouvé. merci.
Il suffit de brancher ton téléphone, mettre les drivers et faire “Run” … rien de plus simple
Ok Cyril ca n’est pas si simple pour moi, c’est la première fois que je développe sur mobile.
J’ai regardé sur la doc android :
http://developer.android.com/g.....evice.html
http://developer.android.com/s.....eshInstall
Je ne sais plus si j’avais installé les drivers mais maintenant je le plug à mon pc seulement pour le recharger et je n’ai pas de message d’alerte me proposant d’installant les drivers.
A partir d’Eclipse:
J’ai la possibilité de Run as :
1) Android application
2) Java Application …
J’ai tenté de suivre la procédure du lien
# Declare your application as “debuggable” in your Android Manifest.
In Eclipse, you can do this from the Application tab when viewing the Manifest (on the right side, set Debuggable to true). Otherwise, in the AndroidManifest.xml file, add android:debuggable=”true” to the element.
# Turn on “USB Debugging” on your device.
On the device, go to the home screen, press MENU, select Applications > Development, then enable USB debugging.
Dans Menu de mon téléphone Android, je ne vois pas “applications” mais tous les programmes et ensuite je ne vois pas Développement
mais la liste des programmes que j’ai installé.
Comment faire?
merci de ton temps et réactivité.
merci de m’aider .
J’ai activé le mode usb debugging , j’ai installé les drivers.
Maintenant je veux le lancer à partir d’Eclipse et je n’ai que les options :
Run on Server => j’ai une erreur (aucune ressource ….)
Android application
….
Petite explication sur l’origine de la dénomination sand box
Le bac à sable étant un lieu sûre, au périmètre circonscrit dans lequel on laisse jouer un enfant en toute sécurité.
L’analogie avec un espace mémoire sécurisé dans lequel tourne une application en toute quietude est donc justifiée.
Merci pour vos efforts
salut,
tout d’abord merci pour tes tutoriaux, qui même s’ils ne sont pas assez exhaustifs pour le total débutant que je suis, ont le mérite d’exister et d’aider à avancer les débutants comme moi.
“Il me semblait avoir déjà expliquer comment ajouter une Activity au AndroidManifest.xml”
Pourrais-tu indiquer lequel stp, car j’en ai fait le tours sans le trouver.
Merci par avance.
A+
@André FABRE : Merci pour la précision
@Herc. : Je pense avoir été le plus précis possible dans ce tutorial. Cette partie fait suite à d’autres parties déjà disponible sur ce site et dans lequel j’aborde Android d’un point de vue totalement novice.
Pour ajouter une nouvelle activité, il suffit simplement d’ajouter une ligne dans le manifest (dans la balise application) :
merci! pour ton aide, je vais tester cela de suite!
Salut,
Tout d’abord merci encore pour ce tuto.
Bon ça y est l’application fonctionne!!;) je sais que je suis débutant mais voici quelques suggestions de modifications que tu pourrais apporter à ton tuto:
1-lorsque l’on crée un projet android sous eclipse on créé également la première activity ainsi qu’un xml dans le res/layout (entre autre).Il serai plus simple que dans ton code ces 2 éléments aient le même noms et indiquer que le nom de l’activity entrée doit être entry ou entrypoint , cela éviterai des erreurs que l’on doit corriger manuellement.et ça donnerai une certaine cohérence dans le sens ou la class entry.java a comme layout entry.xml.
2-la 2eme activity créée GoogleSearch (et/ou class) génère des erreurs dans eclipse à cause des majuscules, peut-être qu’il faudrait l’écrire plutôt googlesearch.
3-Indiquer qu’une image logo_google.png doit être présent dans le répertoire: workspace/”nom de votre projet”/res/drawable”
4-expliquer que pour créer une interface pour l’activity (ou la class) googlesearch il faille cliquer sur file>new android xml puis selectionner layout. (même si cette suggestion relève plus de l’utilisation d’éclipse que de ce tuto précisément).
Voila je crois que c’est tout et encore merci pour ce tuto qui m’a aider et continuera encore certainement à m’aider.
Herc.;)
@Herc :
1 – Je trouve ta remarque cohérente mais je préfère encore faire un nommage du genre : EntryActivity.java qui utilise entry.xml
2 – Le problème ne vient surement pas des majuscule qui sont largement autorisée en Java (et même fortement conseillées dans le nom d’une classe)
3 – Oui .. sauf que ça me parait évident quand on a lu les tutoriaux précédents et qu’il y a le zip fournit
Merci pour le support ! Et bon courage pour la suite
Bonjour,
je suis débutante en développement android, j’ai suivi tous vos tutos, et je voudrais savoir si vous pouviez m’aiguiller pour récupérer une image à partir d’une url et de l’afficher simplement…
Merci
bonjour Mr Cyril ,
je suis debutante en Android,j’ai besoin de savoir comment recuperer des donnees d’après une base et les afficher sur telephone.j’utilise l’eclipse.
une autre question,parfois je lance l’emulateur alors qu’il m’affiche un message Désolé!fermeture soudaine de l’application,et l’execution se fait pas malgré il n’ya pas d’erreur dans le code.
pour etre claire je suis entrain d’appliquer ce qui se trouve dans la formation de l’android mais le code ne marche pas s’il y a une possibilité de m’aider.merci
@nour : Lol pas besoin d’utiliser des “Mr”
. Je suis juste “Cyril”
. La question de récupérer des données d’une base est un peu trop large pour que j’y réponde. C’est un sujet qui demande pas mal d’explications : l’objet principal à étudier et le “ContentProvider”
Pour l’erreur, il faut que tu regarde le LogCat (une vue d’Eclipse). Tu aura des informations précises sur l’Exception qui a déclenché l’affichage de la popup.
merci Cyril,
mais vraiment j’ai besoin d’aide,je me suis bloquée et j’ai besoin d’avancer.je t’avais dit que je suis entrain d’appliquer tout se qui se trouve dans la formation en video de l’android normalment j’ai copié le meme code de la formation,mais ca marche pas.
est ce que tu peux le verifier le code avec moi?
ca c’est le Main
package com.formation.sql;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class Main extends ListActivity implements OnClickListener {
/** Called when the activity is first created. */
DBAdapter db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* getListView().setOnCreateContextMenuListener(this);*/
((Button)findViewById(android.R.id.button1)).setOnClickListener(this);
db = new DBAdapter(this);
db.open();
//placer tt les elements de la BD dans ma listview
DataBind();
}
@Override//creation menu principale
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,100,0,”tout effacer”);
return true;
}
@Override//selection d’un item de menu
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 100:
db.Truncate();
DataBind();
break;
}
return true;
}
protected void onListItemClick(ListView l,View v,int position,long id){
Cursor cursor = (Cursor)l.getAdapter().getItem(position);
String titre = cursor.getString(cursor.getColumnIndex(“titre”));
Toast.makeText(this,”Item id”+id+” : “+titre, Toast.LENGTH_SHORT).show();
super.onListItemClick(l, v, position, id);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(“Action”);
menu.add(0,100,0,”supprimer”);
menu.add(0,200,1,”editer”);
}
@Override
protected void onDestroy() {
db.close();
super.onDestroy();
}
public void DataBind(){
Cursor c = db.recupererLaListeDesProduits();
startManagingCursor(c);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.list_item,c,new String[]{“titre”,”description”,”codebarre”},
new int[]{R.id.textTitre,R.id.TextDescription,R.id.TextCodeBarre});
setListAdapter(adapter);
}
@Override
public void onClick(View v) {
long num =SystemClock.currentThreadTimeMillis();
db.insererUnProduit(“”+num,”Produit n°”+num,”Nouveau Produit”+ num);
DataBind();
}
}
et ca c’est le DBAdapter:
package com.formation.sql;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class DBAdapter {
//instance de databasehelper
DatabaseHelper DBHelper;
//instance de databasehelper
Context context;
//BD de type SQLITE
SQLiteDatabase db;
public DBAdapter (Context context){
this.context = context;
DBHelper = new DatabaseHelper(context);
}
public class DatabaseHelper extends SQLiteOpenHelper{
Context context;
public DatabaseHelper(Context context) {
super(context, “produits”, null, 1);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table produits(_id integer primary key autoincrement,”
+”codeBarre text not null, titre text not null,”
+”description text not null”
+”;)”);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Toast.makeText(context,”Mise à jour de la Base de données version”+oldVersion+”vers”+newVersion, Toast.LENGTH_SHORT).show();
db.execSQL(“DROP TABLE IF EXISTS produits”);
onCreate(db);
}
}
public DBAdapter open(){
db = DBHelper.getWritableDatabase();
return this;
}
public void close(){
db.close();
}
public void Truncate(){
db.execSQL(“DELETE FROM produits”);
}
public long insererUnProduit(String codeBarre,String titre,String description){
ContentValues values = new ContentValues();
values.put(“codeBarre”, codeBarre);
values.put(“titre”, titre);
values.put(“description”, description);
return db.insert(“produits”, null, values);
}
public boolean supprimerproduit(long id){
return db.delete(“produits”,”_id=”+id, null)>0;
}
public Cursor recupererLaListeDesProduits(){
return db.query(“produits”, new String[]{
“_id”,
“codeBarre”,
“titre”,
“description” }, null, null, null, null, null);
}
}
/*public class DBAdapter {
DatabaseHelper DBHelper;
Context context;
SQLiteDatabase db;
public DBAdapter(Context context) {
this.context =context;
DBHelper = new DatabaseHelper(context);
}
public class DatabaseHelper extends SQLiteOpenHelper{
Context context;
public DatabaseHelper(Context context) {
super(context,”produits” ,null,1);
this.context= context ;
}
@Override
public void onCreate(SQLiteDatabase arg0) {
db.execSQL(“create table produits (_id integer primary key autoincrement,”
+”codebarre text not null, titre text not null ,”
+”description text not null”
+”);”);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Toast.makeText(context, “Mise à jour de la Base de données version” +oldVersion +”vers”+newVersion,Toast.LENGTH_SHORT);
//supprimer ttes les donnees a l’interieur
db.execSQL(“DROP TABLT IF EXISTS produits”);
onCreate(db);
}
/* public DBAdapter open(){
//ouvrir la base de donnees pour inserer des donnees
db = DBHelper.getWritableDatabase();
return this ;
}*/
/* public void close(){
db.close();
}
//effacer ttes les données de la base
public void Truncate(){
db.execSQL(“DELETE FROM produits”);
}
//inserer un produit
public long insererUnproduit(String codeBarre,String titre ,String description){
//apporter un baggage
ContentValues values = new ContentValues();
values.put(“codeBarre”,codeBarre);
values.put(“titre”, titre);
values.put(“description”, description);
return db.insert(“produits”, null, values);
}
public boolean supprimerProduit(long id){
return db.delete(“produits”, “id=”+id, null)>0;
}
//recuperer la liste des produits en creant un autr tableau
public Cursor recupererLaListeDesProduits() {
return db.query(“produits”, new String[] {
“_id”,
“codeBarre”,
“description” },null, null, null, null, null);
}
}
}
*/
merci Cyril,
mais vraiment j’ai besoin d’aide,je me suis bloquée et j’ai besoin d’avancer.je t’avais dit que je suis entrain d’appliquer tout se qui se trouve dans la formation en video de l’android normalment j’ai copié le meme code de la formation,mais ca marche pas.
est ce que tu peux le verifier le code avec moi?