androidzielonka/enseignement/android/2016/... · 2016-09-17 · android studio création d’une...
TRANSCRIPT
AndroidWieslaw Zielonka
[email protected] www.irif.univ-paris-diderot.fr/~zielonka
Une application AndroidLes composants d’une application Android :
• Activity gère l’interface graphique
• ContentProvider gestion de données (fichers, bases de données SQLite)
• Service implémente les opérations exécutées en arrière plan
• Broadcast Receiver écoute les événements système
Android studio
Création d’une application :
• File -> Project choisir le nom du projet, le domaine,
• choisir Phone and Tablet et le minimum SDK,
• choisir Blank Activity,
• choisir le nom de l’activité.
Fichiers créés par Android studio
• AndroidManifest.xml
app/manifests/AndroidManifest.xml
• MonCompteur.java
la classe qui implémente les fonctionnalités de l’activité
• app/res/layout/activity_mon_compteur.xml
le fichier xml qui décrit le layout (le positionnements) des éléments qui compose l’activité
Modification de layout
Le but est de modifier l’application par android.
Nous voulons une application qui affiche un compteur entier (valeur 0 initialement) et deux boutons, bouton plus et boutons moins.
En click sur le bouton plus augmente la valeur du compteur, un click sur le bouton moins décrémente la valeur de compteur.
Ajouter les boutons dans layoutAjouter les deux boutons dans le fichier layout soit à l’aide de la souris soit en ajoutant les balises xml: <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PLUS" android:id="@+id/buttonPlus" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textSize="30dp" android:onClick="plus" />
les attributs: • text — le texte affiché dans le bouton,• id — identifiant de bouton, noter @+id/ qui précède la valeur de l’identifiant• textSize - la taille du texte• layout_width et layout_height - largeur et hauteur, la valeur wrap_content signifie la
taille suffisante pour montrer le texte affiché dans le bouton. • onClick — la valeur de l’attribut donne le nom de la méthode (à ajouter dans Activity)
qui sera exécuté quand l’utilisateur clique sur le bouton.
Deuxième bouton
La balise xml pour le deuxième bouton est similaire, mais avec un autre id, un autre texte à afficher.
Pour le deuxième bouton on n’aura pas d’attribut onClick , l’action associée au deuxième bouton sera impémentée avec un listener.
TextViewTextView est un élément qui permet afficher un texte.
L’activité générée par android studio possède déjà un TextView, on change juste le texte affiché, la taille du texte et on ajoute un identifiant: <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:textSize="35dp" android:layout_alignParentTop="true" android:id="@+id/text" />
Les attributs:• text — le texte affiché dans TextView• textSize - la taille• id — identifiant
Le fichier layoutLe fichier layout rassemble tous ces éléments à l’intérieur de RelativeLayout (les classes …Layout sont des classes qui gèrent les positionnement des View). <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.zielonka.applicours.MonCompteur"> <TextView … android:id="@+id/text" /> <Button … android:id=« @+id/buttonPlus"/> <Button … android:id=« @+id/buttonMoins" /></RelativeLayout>
Activitypublic class MonCompteur extends AppCompatActivity { TextView text; Button moins; int compteur; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mon_compteur); text = (TextView) findViewById(R.id.text); moins = (Button) findViewById(R.id.buttonMoins); moins.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { compteur--; text.setText(compteur + ""); } }); } public void plus(View view) { compteur++; text.setText(compteur + ""); }}
L’activité démarre par l’appel à la méthode onCreate :
protected void onCreate(Bundle savedInstanceState) { }
La méthode setContentView crée à partir de la description donnée dans le fichier layout toutes les classes qui forment l’interface graphique
setContentView(R.layout.activity_mon_compteur)
Le paramètre de setContentView() est le nom de fichier layout (précédé par R.layout).
Récupérer les références vers les objets qui constituent l’interface
La méthode
View findViewById(int id)
retourne la référence vers un élément d’interface graphique. L’argument de la méthode : id de l’objet assignée dans le fichier layout.
Donc si dans le fichier layout on a : <TextView . . . android:id="@+id/text" />
<Button . . . android:id=« @+id/buttonPlus" />
alors dans java
TextView text; Button moins;
text = (TextView) findViewById(R.id.text); moins = (Button) findViewById(R.id.buttonMoins);
Dans
android:id="@+id/text"
• @ indique une ressource • + indique la première occurrence • text — le nom de l’identifiant à choisir à votre guise
Associer un listener à un bouton
moins.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { compteur--; text.setText(compteur + ""); }});
Associer une méthode à un bouton (sans listener)
Au lieu d’installer un listener on peut spécifier dans l’attribut android:onClick le nom de la méthode que Andoid appelle quand l’utilisateur clique sur le bouton:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PLUS" android:id="@+id/buttonPlus" android:textSize="30dp" android:onClick="plus" />
La valeur de l’attribut onClick donne le nom de la méthode qui est exécutée si on clique sur le bouton. La méthode correspondante implémentée dans Activity
public void plus(View view) { compteur++; text.setText(compteur + "");}
Sauvegarde de l’état de l’activité
Quand on change la position de l’appareil mobile (horizontale <—> verticale) l’activité courante est détruite et reconstituée avec l’appel à onCreate().
De même façon, si une activité A est exécutée et une autre activité B démarre, l’activité A est détruite (l’objet Activity de A est détruit). Si on revient avec le bouton BACK vers l’activité A l’objet correspondant à l’activité A sera reconstruit et la méthode onCreate() de A exécutée.
Si on ne fait rien les valeurs de variables locales de A (l’état de l’objet) ne seront pas préservées.
Dans notre exemple il faut préserver la valeur de compteur.
On ajoute dans Actvity la méthode : @Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("compteur", compteur);}
La méthode onSaveInstanceState()est appelée quand l’objet Activity est détruit par Android. Mettez dans le Bundle les valeurs à sauvegarder sous forme (clé, valeur) en utilisant différentes méthodes put de Bundle. Le paramètre clé est de type String.
Préserver l’état de Activity avec un Bundle
Récupérer les valeurs sauvegardées dans Bundle dans la méthode onCreate()
Le Bundle sauvegardé dans onSaveInstanceState() devient le paramètre de onCreate() quand l’activité redémarre. On ajoute le code pour récupérer la valeur de compteur: @Overrideprotected void onCreate(Bundle savedInstanceState) {
/* autre code */
if (savedInstanceState == null) { compteur = Integer.parseInt(String.valueOf(text.getText()));} else { compteur = savedInstanceState.getInt("compteur");} text.setText(compteur + "");
Pour chaque méthode put Bundle possède une méthode get() qui permet de récupérer la valeur associée à une clé.
Ressources String
On préfère que les String soient déclarés dans les ressources au lieu d’être en dur dans le programme ou dans le fichier layout. A la place de : <Button . . . android:text="PLUS" />
mettre dans app/res/values/strings.xml
<string name="plus">PLUS</string>
Dans le fichier layout :<Button . . . android:text="@string/plus" />
valeur de l’attribut en dur
nom de la ressource