Correction programmation mobile 04 : activités et interface Android

Correction construite à partir du sujet local et de son schéma original. Les numéros ci-dessous correspondent à ce schéma, qui a été relu avant la rédaction.

Énoncé et barème

Lire le sujet original. Trois parties : connaissances 6 points, cycle de vie 7 points, interface 7 points.

Exercice 1 : questions de cours

Activité, framework et intent

Voir le corrigé expliqué

Une activité est un composant Android qui fournit un point d’interaction avec l’utilisateur. Un framework organise des composants et leur cycle d’exécution ; Android et Flutter sont deux exemples de cadres de développement mobile. Un intent exprime une opération : explicite, il nomme un composant ; implicite, il décrit une action que le système doit résoudre.

Plateforme, système et boutiques

Voir le corrigé expliqué

Le système gère notamment les processus, la mémoire et les périphériques. La plateforme inclut aussi SDK, outils et mécanismes de distribution. Android et iOS désignent des systèmes et, par extension, leurs écosystèmes. Dans le contexte historique du sujet : Google Play, App Store et Windows Phone Marketplace. « Windows7 » doit ici être compris comme Windows Phone 7, pas le système Windows de bureau.

Exercice 2 : lecture du schéma

Schéma original du sujet mobile 04 avec quatre méthodes numérotées
Support déjà présent dans les fichiers locaux du site.

Retrouver les quatre méthodes

Voir le corrigé expliqué

1 = onCreate(), 2 = onStart(), 3 = onPause(), 4 = onDestroy(). onStart correspond à la visibilité ; onResume à l’état repris, prêt pour l’interaction.

Quelle méthode implémenter et comment conserver l’état ?

Voir le corrigé expliqué

Dans une activité habituelle, on surcharge onCreate pour initialiser l’interface et on appelle super. Ce n’est pas une obligation abstraite du langage Java : la classe de base possède une implémentation. Un petit état d’interface peut être sauvegardé dans le Bundle avec onSaveInstanceState, puis relu à la création. Ne comptez pas sur onDestroy pour une sauvegarde indispensable : un processus peut disparaître sans cet appel.

Communication et menus

Voir le corrigé expliqué

Un intent explicite peut transmettre de petites données par extras. Avec les vues classiques, on définit les éléments du menu dans res/menu, on les charge avec getMenuInflater().inflate depuis onCreateOptionsMenu et on traite leur identifiant dans onOptionsItemSelected. Une barre d’application doit être configurée pour les afficher.

Exercice 3 : réponses sur l’interface

Dossier XML et callback recherche

Voir le corrigé expliqué

Le fichier de mise en page se place dans res/layout. Pour l’attribut XML android:onClick="recherche", le callback historique attendu est public void recherche(View view) dans le contexte adapté. Une alternative consiste à installer un écouteur en Java.

Clic long et durée du Toast

Voir le corrigé expliqué
b1.setOnLongClickListener(view -> {
    Toast.makeText(MonActivity.this, "long clic!", Toast.LENGTH_SHORT).show();
    return true;
});

Le booléen vrai indique que l’événement est consommé. L’argument de durée du Toast n’est pas une durée libre en millisecondes : on utilise LENGTH_SHORT ou LENGTH_LONG, pas 1000.

Saisie de texte et barre de progression

Voir le corrigé expliqué
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ed"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inputType="text"
    android:textColor="#16222E" />

EditText permet une saisie modifiable. Les deux dimensions match_parent répondent littéralement à la consigne ; dans un formulaire réel, la hauteur wrap_content est souvent plus adaptée. findViewById(R.id.progBar) retrouve la vue d’identifiant @+id/progBar ; la variable pb est de type ProgressBar. Il faut appeler setContentView avant cette recherche.

Exemple complet de clic long sans fichier XML

package com.nkilitech.demo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;

public class MonActivity extends Activity {
    @Override public void onCreate(Bundle state) {
        super.onCreate(state);
        Button b1 = new Button(this);
        b1.setText("Recherche");
        b1.setOnLongClickListener(view -> {
            Toast.makeText(this, "long clic!", Toast.LENGTH_SHORT).show();
            return true;
        });
        setContentView(b1);
    }
}

Déclarez cette activité dans le manifeste d’un projet Android Java. Essayez un clic court puis un appui long : seul le second déclenche cet écouteur.

Référence : Android Developers : cycle de vie.

Référence : Android Developers : menus.