• Aucun résultat trouvé

Application Énoncé

L'activité consistera en un gros bouton. Cliquer sur ce bouton lancera une boîte de dialogue dont le texte indiquera le nombre de fois que la boîte a été lancée. Cependant une autre boîte de dialogue devient jalouse au bout de 5 appels et souhaite être sollicitée plus souvent, comme à la figure suivante.

Instructions

Pour créer une boîte de dialogue, on va passer par le constructeur Dialog (Context context). On pourra ensuite lui donner un texte à afficher à l'aide de la méthode void setTitle (CharSequence text).

Ma solution

Code : Java import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;

public class StringExampleActivity extends Activity { private Button bouton;

//Variable globale, au-dessus de cette valeur c'est l'autre boîte de dialogue qui s'exprime

private final static int ENERVEMENT = 4; private int compteur = 0;

private final static int ID_NORMAL_DIALOG = 0; private final static int ID_ENERVEE_DIALOG = 1;

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bouton = (Button) findViewById(R.id.bouton); bouton.setOnClickListener(boutonClik);

}

private OnClickListener boutonClik = new OnClickListener() { @Override

public void onClick(View v) {

// Tant qu'on n'a pas invoqué la première boîte de dialogue 5 fois

if(compteur < ENERVEMENT) { //on appelle la boîte normale compteur ++; showDialog(ID_NORMAL_DIALOG); } else showDialog(ID_ENERVEE_DIALOG); } }; /*

* Appelée qu'à la première création d'une boîte de dialogue * Les fois suivantes, on se contente de récupérer la boîte de dialogue déjà créée…

* Sauf si la méthode « onPrepareDialog » modifie la boîte de dialogue.

*/

@Override

public Dialog onCreateDialog (int id) { Dialog box = null;

switch(id) {

// Quand on appelle avec l'identifiant de la boîte normale case ID_NORMAL_DIALOG:

box = new Dialog(this);

box.setTitle("Je viens tout juste de naître."); break;

// Quand on appelle avec l'identifiant de la boîte qui s'énerve case ID_ENERVEE_DIALOG:

box = new Dialog(this);

box.setTitle("ET MOI ALORS ???"); }

return box; }

@Override

public void onPrepareDialog (int id, Dialog box) { if(id == ID_NORMAL_DIALOG && compteur > 1)

box.setTitle("On est au " + compteur + "ème lancement !"); //On ne s'intéresse pas au cas où l'identifiant vaut 1, puisque cette boîte affiche le même texte à chaque lancement }

}

On va maintenant discuter des types de boîte de dialogue les plus courantes.

La boîte de dialogue de base

On sait déjà qu'une boîte de dialogue provient de la classe Dialog. Cependant, vous avez bien vu qu'on ne pouvait mettre qu'un titre de manière programmatique. Alors, de la même façon qu'on fait une interface graphique pour une activité, on peut créer un fichier XML pour définir la mise en page de notre boîte de dialogue.

Code : 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"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher"/> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent"

android:text="Je suis une jolie boîte de dialogue !"/> </LinearLayout>

</LinearLayout>

On peut associer ce fichier XML à une boîte de dialogue comme on le fait pour une activité : Code : Java

Dialog box = new Dialog(this);

box.setContentView(R.layout.dialog);

box.setTitle("Belle ! On dirait un mot inventé pour moiiii !");

Sur le résultat, visible à la figure suivante, on voit bien à gauche l'icône de notre application et à droite le texte qu'on avait inséré. On voit aussi une des contraintes des boîtes de dialogue : le titre ne doit pas dépasser une certaine taille limite.

Résultat en image

Cependant il est assez rare d'utiliser ce type de boîte de dialogue. Il y a des classes bien plus pratiques.

AlertDialog

On les utilise à partir du package android.app.AlertDialog. Il s'agit de la boîte de dialogue la plus polyvalente. Typiquement, elle peut afficher un titre, un texte et/ou une liste d'éléments.

La force d'une AlertDialog est qu'elle peut contenir jusqu'à trois boutons pour demander à l'utilisateur ce qu'il souhaite faire. Bien entendu, elle peut aussi n'en contenir aucun.

Pour construire une AlertDialog, on peut passer par le constructeur de la classe AlertDialog bien entendu, mais on préférera utiliser la classe AlertDialog.Builder, qui permet de simplifier énormément la construction. Ce constructeur prend en argument un Context.

Un objet de type AlertDialog.Builder connaît les méthodes suivantes :

AlertDialog.Builder setCancelable (boolean cancelable) : si le paramètre cancelable vaut true, alors on pourra sortir de la boîte grâce au bouton retour de notre appareil.

AlertDialog.Builder setIcon (int ressource) ou AlertDialog.Builder setIcon

(Drawable icon): le paramètre icon doit référencer une ressource de type drawable ou directement un objet de type Drawable. Permet d'ajouter une icône à la boîte de dialogue.

AlertDialog.Builder setMessage (int ressource) ou AlertDialog.Builder setMessage

(String message) : le paramètre message doit être une ressource de type String ou une String. AlertDialog.Builder setTitle (int ressource) ou AlertDialog.Builder setTitle

(String title) : le paramètre title doit être une ressource de type String ou une String.

AlertDialog.Builder setView (View view) ou AlertDialog.Builder setView (int ressource): le paramètre view doit être une vue. Il s'agit de l'équivalent de setContentView pour un objet de type Context. Ne perdez pas de vue qu'il ne s'agit que d'une boîte de dialogue, elle est censée être de dimension réduite : il ne faut donc pas ajouter trop d'éléments à afficher.

On peut ensuite ajouter des boutons avec les méthodes suivantes :

AlertDialog.Builder setPositiveButton (text, DialogInterface.OnClickListener listener), avec text qui doit être une ressource de type String ou une String, et listener qui définira que faire en cas de clic. Ce bouton se trouvera tout à gauche.

AlertDialog.Builder setNeutralButton (text, DialogInterface.OnClickListener listener). Ce bouton se trouvera entre les deux autres boutons.

AlertDialog.Builder setNegativeButton (text, DialogInterface.OnClickListener listener). Ce bouton se trouvera tout à droite.

Enfin, il est possible de mettre une liste d'éléments et de déterminer combien d'éléments on souhaite pouvoir choisir :

Méthode Éléments sélectionnables Usage AlertDialog.Builder setItems (CharSequence[] items, DialogInterface.OnClickListener listener) Aucun

Le paramètre items correspond au tableau contenant les éléments à mettre dans la liste, alors que le paramètre listener décrit l'action à effectuer quand on clique sur un élément.

AlertDialog.Builder

Le paramètre checkedItem indique l'élément qui est sélectionné par défaut. Comme d'habitude,

setSingleChoiceItems (CharSequence[] items, int checkedItem,

DialogInterface.OnClickListener listener)

Un seul à la fois

on commence par le rang 0 pour le premier élément. Pour ne sélectionner aucun élément, il suffit de mettre -1.

Les éléments seront associés à un bouton radio afin que l'on ne puisse en sélectionner qu'un seul. AlertDialog.Builder

setMultipleChoiceItems

(CharSequence[] items, boolean[] checkedItems,

DialogInterface.OnClickListener listener)

Plusieurs

Le tableau checkedItems permet de

déterminer les éléments qui sont sélectionnés par défaut. Les éléments seront associés à une case à cocher afin que l'on puisse en sélectionner plusieurs.

Les autres widgets