Android : Communiquer avec l'utilisateur

05 septembre 2012 rdorigny 2 commentaires

Dans ce chapitre, nous allons étudier les mécanismes principaux du framework JAVA qui sont disponibles pour échanger avec l'utilisateur.

Évidement, le dialogue via une interface est un élément essentiel! Dans les développements d'applications JAVA, on retrouve ces mécanismes un peu partout. Il est donc important de bien comprendre leurs fonctionnements pour pouvoir les utiliser abondamment.

Il ne s'agit pas seulement d'afficher des informations, mais aussi de proposer des choix à l'utilisateur, voir de poser des questions...

1)Le toast

Le toast correspond à l'affichage d'un simple message à l'attention de l'usager du terminal Android.

Toast toast=Toast.makeText(this,"coucou",Toast.LENGTH_LONG); toast.show();

Il est possible de positionner votre message en jouant sur la gravité:
import android.view.Gravity; Toast toast=Toast.makeText(this,"coucou",Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP,0,50); toast.show();

Il est possible de personnaliser le format et les couleurs avec setView(view) où la vue doit être redéfinie dans un fichier layout spécifique.

2)Les notifications

Une autre façon de communiquer et de créer une notification via l'interface Android.
package doritique.fr; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; public class TesterActivity extends Activity { private static final int Notification_ID = 1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //Recherche le notification manager NotificationManager nm =(NotificationManager) getSystemService(NOTIFICATION_SERVICE); //Les variables Context context = getApplicationContext(); CharSequence contentTitle = "Ma notification"; CharSequence contentText = "Bonjour!"; //Construction de la notification Notification.Builder builder = new Notification.Builder(context) .setSmallIcon(R.drawable.doritique) .setAutoCancel(true) .setContentTitle(contentTitle) .setContentText(contentText); //Get current notification Notification mNotification; mNotification = builder.getNotification(); //Show the notification nm.notify(Notification_ID, builder.getNotification()); } }

Ce qui donnera:

3)Les événements

Un des objectifs d'une application mobile et d'échanger avec l'usager, notamment en lui permettant d'agir sur l'application, et donc de générer des événements. On distingue principalement:
  • key: pression sur une touche du mobile,
  • touch: pression sur l'écran,
  • click: pression sur l'écran ou sur le bouton de validation,
  • longclick: pression longue, plus d'une seconde entre la pression et le relâchement,
  • focus change: navigation de l'usager.

    La classe vue définit un certain nombre d'interfaces JAVA pour gérer les événements. c'est à dire pour l'interface JAVA View.OnXXXXListener, on définit une unique méthode void onXXXX(View v).

    Event

    Interface JAVA

    Click View.OnClickListener
    Long click View.OnLongClickListener
    Focus change View.OnFocusChangeListener
    Key View.OnKeyListener
    Froyo View.OnClicListener
    Touch View.OnTouchListener


    package doritique.fr; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class TesterActivity extends Activity { private static final int Notification_ID = 1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); final Toast toast=Toast.makeText(this,"Click sur le bouton",Toast.LENGTH_LONG); View bt=(Button) findViewById(R.id.button2); bt.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { toast.show(); //Gestion de la notification //Les variables Context context = getApplicationContext(); CharSequence contentTitle = "Ma notification"; CharSequence contentText = "Bonjour!"; //Recherche le notification manager NotificationManager nm =(NotificationManager) getSystemService(NOTIFICATION_SERVICE); //Construction de la notification Notification.Builder builder = new Notification.Builder(context) .setSmallIcon(R.drawable.doritique) .setAutoCancel(true) .setContentTitle(contentTitle) .setContentText(contentText) .setContentInfo("azerty"); //Get current notification Notification mNotification; mNotification = builder.getNotification(); //Show the notification nm.notify(Notification_ID, builder.getNotification()); } }); } }

    La méthodologie est toujours la même. On déclare une vue associée à notre événement, puis on déclare un "Listener" pour la vue et sur l’événement que l'on souhaite surveiller. Ensuite, on surcharge la méthode onClick en précisant les actions à réaliser suite à l’événement.

    4)Les boites de dialogues

    Les dialogues sont des messages qui s'affichent sur la vue en cours.Le framework Android définit une classe Dialog qui a plusieurs sous-classes tels que AlertDialog (boite de dialogue), ProgressDialog (Progressbar avec bouton), TimePickerDalog (sélecteur d'horaire), DatePickerDialog (sélecteur de date),....


    Pour ouvrir un dialogue:
  • on appelle la méthode showDialog(),
  • le framework suit la logique ci-dessous, c'est à dire teste si le dialogue existe,
  • sinon, il appelle la méthode showDialog(), il faut donc surcharger cette méthode,
  • la méthode onPrepareDialog() permet de modifier le dialogue juste avant l'affichage,
  • affiche le dialogue.

  • package doritique.fr; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; public class TesterActivity extends Activity { private static final String TAG = "DialogActivity"; private static final int DLG_SHOW_ALERT_ID = 1; ProgressDialog progressDlg; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); // Appel du dialogue sur un event click findViewById(R.id.dlg_bt_createAlertDlg).setOnClickListener( new OnClickListener() { public void onClick(View v) { showDialog(DLG_SHOW_ALERT_ID); } }); } protected Dialog onCreateDialog(int id) { Toast toast = Toast.makeText(getApplicationContext(),"Appel de onCreateDialog",Toast.LENGTH_LONG); toast.show(); Dialog dialog = null; switch (id) { case DLG_SHOW_ALERT_ID: // Appel de la fonction dialog = showAlertDialog(); break; default: // Le numéro id n'est pas connu dialog = null; } // Retourne le dialogue return dialog; } private Dialog showAlertDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Voulez vous arréter le programme?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Toast toast = Toast.makeText(getApplicationContext(), R.string.str_yes_pressed,Toast.LENGTH_LONG); toast.show(); // Dialogue sera automatiquement rejetée } }) .setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Toast toast = Toast.makeText(getApplicationContext(), R.string.str_no_pressed, Toast.LENGTH_LONG); toast.show(); // Calling cancel will dismiss the dialog and call // any registered onCancelListener dialog.cancel(); } }); return builder.create(); } }

    Ce qui donne:


    5)Les menus

    5.1)Le menu classique

    Les menus sont accessibles par le bouton du mobile Android. Très utiles pour réaliser un menu contextuelle, l'accès a un formulaire, ...
    Bien évidemment, le framework Android encadre la gestion des menus.
    La fonction oncreateOptiosMenu() est appelé systématiquement pour créer le menu, et la fonction onOptionsItemSelected() pour prendre en compte les évènements sur les boutons du menus.

    package doritique.fr; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; public class TesterActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.menu_param: Toast.makeText(TesterActivity.this,"Ouverture des param", Toast.LENGTH_SHORT).show(); return true; case R.id.menu_quit: finish(); return true; default: return true; } } }

    On utilise un fichier xml pour définir, le menu sous res/menu/menu.xml et sera référencé R.menu.menu . La classe MenuInflater permet de générer une occurrence de ce menu.
    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_param" android:title="@string/menu_str_param" android:icon="@drawable/doritique"> </item> <item android:id="@+id/menu_quit" android:title="@string/main_str_quit"> </item> </menu>


    <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, TesterActivity!</string> <string name="app_name">doritique.fr:Exemple de menu</string> <string name="main_str_quit">quitter</string> <string name="menu_str_param">Paramètres</string> </resources>

    Ce qui donnera:

    5.2)Le sous-menu

    Un sous-menu est généré simplement en le précisant dans le fichier xml.
    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_param" android:title="@string/menu_str_param" android:icon="@drawable/doritique"> </item> <item android:id="@+id/menu_quit" android:title="@string/main_str_quit"> </item> <item android:id="@+id/option" android:title="Options" android:icon="@drawable/ic_launcher"> <menu android:id="@+id/sousmenu"> <item android:id="@+id/favoris" android:title="Favoris" /> <item android:id="@+id/stats" android:title="Stats" /> </menu> </item> </menu>

    5.3)Le menu contextuel

    Android propose la fonctionnalité de menu contextuel. Elle est peu utilisée, mais en gros c'est un menu qui apparaît lors d'un clic long sur un objet.
    La méthodologie est quasi identique à ce que nous avons vu, sauf que le menu contextuel doit être déclaré par la méthode registerForContextMenu() pour les vues qui disposent d'un menu contextuel. Ensuite, on surcharge la méthode onCreateContextMenu().

    package doritique.fr; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class TesterActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); registerForContextMenu((TextView)findViewById(R.id.monTextView)); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.monmenu, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case R.id.itemOptions: Toast.makeText(this, "Ouverture des options", Toast.LENGTH_SHORT).show(); return true; case R.id.itemQuitter: finish(); return true; } return super.onMenuItemSelected(featureId, item); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.monmenucontextuel, menu); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.itemCoucou: Toast.makeText(this, "Coucou tout le monde !", Toast.LENGTH_SHORT).show(); return true; case R.id.itemHello: Toast.makeText(this, "Hello World !", Toast.LENGTH_SHORT).show(); return true; } return super.onContextItemSelected(item); } }

    Avec main.xml
    <?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="fill_parent"> <TextView android:id="@+id/monTextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/menu_str_menucontextuel"/> </LinearLayout>

    Avec string.xml
    <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, TesterActivity!</string> <string name="app_name">doritique.fr:Exemple de menu</string> <string name="main_str_quit">quitter</string> <string name="menu_str_param">Paramètres</string> <string name="menu_str_menucontextuel">Le menu contextuel</string> </resources>

    Avec monmenucontextuel.xml
    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/itemCoucou" android:title="Coucou"></item> <item android:id="@+id/itemHello" android:title="Hello"></item> </menu>

    Avec monmenu.xml
    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:title="Options" android:id="@+id/itemOptions"></item> <item android:title="Quitter" android:id="@+id/itemQuitter"></item> </menu>


    Ce qui donnera:






    Weight loss - 2013-07-08 23:46:35
    Merci pour la critique sensée sur www.doritique.fr . Moi et mon voisin ont été simplement prépare à faire quelques recherches à ce sujet. Nous avons eu un prendre un livre dans notre bibliothèque locale, mais je pense que j'ai appris plus de ce poste . Je suis très heureux de voir une si grande information partagée librement là-bas.
    rdorigny - 2013-07-09 00:01:08
    Merci. L objectif est effectivement d'être à usage publique! :-)

    Pseudonyme (obligatoire) :
    Adresse mail (obligatoire) :
    Site web :




    © 2024 www.doritique.fr par Robert DORIGNY