Travaux pratique avec correction sur la programmation Android
TP Android
Exercice 1 : Construction d'une IHM avec des composants Android
Le but de cet exercice est de construire une interface humain-machine (IHM) présentant plusieurs composants graphiques Android (View). Cette IHM permet de faire une authentification en demandant un couple (nom de login, un mot de passe). Après appui sur le bouton Connecter, un Toast indique si le couple donné convient ou pas.
1°) Indiquez les composants graphiques Android qui interviennent dans cette IHM.
Remarque : le troisième (si, si !) composant n'affiche pas l'écho des caractères.
2°) Construire cette IHM avec l'environnement Eclipse et le plug-in Android. On demande d'écrire le moins de code Java possible. Les chaînes de caractères seront plutôt définies dans le fichier .
Réaction aux interactions utilisateur
3°) Ecrire le code Java qui, lorsque le bouton Connecter est actionné par l'utilisateur, une vérification d'authentification est faite et le Toast affiche le résultat (bon couple login, mot de passe ou pas).
4°) Ecrire le code Java qui, lorsque le bouton Connecter est actionné par l'utilisateur, si le couple (login, mot de passe) est correct, une nouvelle activité est affichée indiquant une bonne connexion.
Exercice 2 :ListView, Velibs and Cie !
Vous allez, dans ce TP, construire une application s'exécutant sous Android. L'application présente tout d'abord une fenêtre avec deux items dans une liste , "Voir les stations Vélib" et "A propos des Velib". L'item "A propos des Vélib" amène un nouvel écran de renseignements sur les Vélibs, l'item "Voir les stations Vélib" amène un écran proposant la liste des stations Vélib. On interrogera pour cela l'URL .
L'interface graphique Première étape : Ecrire uneActivityqui présente uneListViewavec 2 items "Voir les stations Vélib" et "A propos des Vélib"
Première étape : Construire une IHM affichant une ListView
Les principales étapes de développement sont décrites ci dessous.
1°) Lancer Eclipse et choisir un répertoire de travail (workspace) par exemple .\TP.
Créer un nouveau projet Android (File | New | Project | Android | Android Project) en utilisant l'API 8 Android APIs 2.2.
Vous allez suivre les étapes du cours pour créer la ListView avec ses 2 items.
2°) Créer le fichier représentant l'IHM des items de la liste (voir le cours).
3°) Dans le fichier représentant le premier écran de lancement de l'application, indiquer que vous devez avoir une ListView. Ce fichier doit donc avoir pour contenu :
-------------------------------------------
fichier
-------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="; android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<ListView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/listMenu"> </ListView>
</LinearLayout>
Remarque : sous Eclipse pour indenter correctement (un fichier XML), utiliser CTRL+a (= tout sélectionner) suivi de CTRL+i (indenter).
Par quel identifiant dans votre code Java, pourrez vous manipuler ce ListView ?
4°) Ecrire, dans l'Activity de lancement de votre application, le code Java qui récupère la ListView et qui l'alimente des deux items "Voir les stations Vélib" et "A propos des Vélib". On repèrera ces deux items par les identifiants seeAllStations et aboutUs.
Remarque : sous Eclipse, pour importer les bonnes classes et interfaces Java, utiliser la combinaison de touche SHIFT+CTRL+O
5°) Lancer l'exécution de votre application en sélectionnant votre projet : c'est important car sélectionner autre chose amène parfois des problèmes !
Puis menu Run | Run As | 2 Android Application
Remarque sur le AVD
Si vous avez besoin d'un Android Virtual Device (= AVD = bref un émulateur de téléphone ou tablette), en créez un.
Pour cela lancer l'Android Virtual Manager (bouton sous la barre de menu)
ou Window | AVD Manager
Dans la fenêtre Android Virtual Device Manager cliquer New
Dans la fenêtre Create new Android Virtual Device (AVD), appelez le
AVDGoogleAPIs2.2API8 puis le chercher dans la liste Target
Cliquez Create AVD (bouton en bas de cette fenêtre).
Cet AVD apparaît alors dans la liste des AVD.
Lancer votre application. Vous devez obtenir :
Seconde étape : Prendre en compte les interactions utilisateurs
1°) On veut désormais que :
- lorsque l'utilisateur choisit l'item "Voir les stations Vélib", un Toast affiche "En cours de développement"
- lorsque l'utilisateur choisit l'item "A propos des Vélib", une nouvelle activité contenant unTextView qui affiche des renseignements sur les Vélibs est lancée.
Bref
et
Ecrire le code nécessaire au traitement des événements. Ne pas oublier de déclarer la nouvelle activity dans l'.
Troisième étape : Récupérer des informations réseau
On s'intéresse désormais au résultat à obtenir lorsqu'on sélectionne le premier item. La liste des stations Velib devra être affichée.
Pour cela on contactera le site
1°) Connecter vous à ce site. Quel type de données retourne ce site ?
On va donc faire un parsing (une analyse) de ces données XML. Le résultat sera donc une liste de Stations Vélib.
La classe StationVelib
2°) Construire une classe StationVelib qui modélise une station vélib. Ce pourra être :
publicclass StationVelib { private String nom; private String numero;
public String getNom() { return nom;
}
publicvoid setNom(String nom) { this.nom = nom;
}
public String getNumero() { return numero;
}
publicvoid setNumero(String numero) { this.numero = numero;
}
}
Le but sera donc d'obtenir un ArrayList<StationVelib> après l'analyse XML. On a donc besoin de lancer la construction d'une StationVelib après lecture de certaines balises XML et d'enregistrer cette balise après construction dans un ArrayList<StationVelib>.
La classe StationsParser
3°) Définir la classe StationsParser qui va être un "handler XML" pour analyser un flux XML. Un "handler XML" est un traitant de fichier XML, objet d'une sous classe de la classe .helpers.DefaultHandler. Il décrit les actions à effectuer lorsqu'on traite le fichier XML. Essentiellement ici, il construit un ArrayList<StationVelib>, qui sera ensuite passée à l'adaptateur associé à la ListView affichant toutes les stations.
Cette classe commence par :
publicclassStationsParserextendsDefaultHandler {private ArrayList<StationVelib> arrList; private XMLReader xr; private Context ctx;
public StationsParser(Context ctx) throws Exception { this.ctx = ctx;
URL urlBase = new URL(";);
InputSource is = new InputSource(urlBase.openStream());
// traitementdu parsing XML : factory XML,
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser(); xr = sp.getXMLReader(); xr.setContentHandler(this);
xr.parse(is);
}
Par la suite des actions sont déclenchées sous certains événements de traitement du fichier XML. Ce sont, par exemple, les lectures de balises d'ouverture (startElement()), lecture de balise de fermeture (endElement()), etc.
4°) Compléter cette classe par :
public ArrayList<StationVelib> getArrList() { return arrList;
}
publicvoid setArrList(ArrayList<StationVelib> arrList) { this.arrList = arrList;
}
@Override
publicvoid endDocument() throws SAXException { super.endDocument();
}
@Override
publicvoid startDocument() throws SAXException { super.startDocument();
arrList = new ArrayList<StationVelib>();
}
@Override
publicvoid startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (localName.equals("marker")) {
StationVelib s = new StationVelib();
s.setNom(attributes.getValue("name"));
s.setNumero(attributes.getValue("number"));
(s);
}
}
}
Les méthodes startElement(), startDocument(), endDocument() étant lancées
lors du traitement du fichier XML, on comprend qu'à la fin de la lecture (et du traitement du flux XML), on obtienne dans arrList, un ensemble d'objets de la classe StationVelib (c'est à dire un ArrayList<StationVelib>).
La classe StationsAdapter
On va écrire l'adapteur de la liste des stations vélib. En effet, ce sera une ListView qui va afficher la liste des stations Velib. Il lui faut donc un adaptateur.
5°) Cet adaptateur reçoit ses données de l'ArrayList<StationVelib> du
StationsParser (cf. question précédente) d'où le début du code de cette classe :
publicclass StationsAdapter extends ArrayAdapter<StationVelib> { private ArrayList<StationVelib> arrList;
public StationsAdapter(Context ctx, Activity activity,
ArrayList<StationVelib> arrList) { super(ctx, 1, arrList); this.arrList = arrList;
}
6°) Essentiellement, il doit fabriquer la View qui sera insérée à la position position de la ListView associée, c'est à dire un item de la ListView. C'est évidemment ce qui correspond à l'objet arrList à son indice position. De plus ce qui est fabriqué est un TextView. On décrit tout d'abord les caractéristiques de ce TextView dans le fichier . Voici ce fichier :
----------------------------------------------------------fichier
-----------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="; android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<TextView
android:id="@+id/item1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:textAppearance="?android:attr/textAppearanceLarge" > </TextView>
</LinearLayout>
7°) Compléter la classe StationsAdapter par le code ci dessous :
/**
* Laméthodecidessousconstruit l'item dela ListView,
* quisera à l'indice position * etretournecet item
*/ @Override
public View getView(int position, View convertView, ViewGroup parent) {
// Un LayoutInflater estunconstructeurde View à partir d'une source XML
// On l'obtient (et on neleconstruit pas par new !)
// par exemple par (getContext());
LayoutInflater inflater = LayoutInflater.from(getContext());
View row = inflater.inflate(R.layout.ligne_station, null);
// le second argument est l'éventuel parent delavuerécupérée
TextView label = (TextView) row.findViewById(R.id.item1); label.setText((position).getNom());
return row;
}
}
Ce peut paraître compliqué, mais les commentaires donnent les explications.
La classe ListingDesStationsActivity
Il faut désormais écrire la dernière classe qui affichera la liste des stations. C'est la classe ListingDesStationsActivity (qui est donc une Activity).
8°) Ecrire le fichier IHM de cette activity.
-------------------------------------------------------------fichier
--------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="; android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<ListView
android:id="@+id/listViewFiltreStations" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView>
</LinearLayout>
9°) Ecrire la classe ListingDesStationsActivity qui est une Activity. Cette
Activity va présenter une fenêtre contenant la liste des stations vélibs, les données de cette liste ayant été fabriquées par les questions précédentes. Cette classe commence donc évidemment par
:
publicclass ListingDesStationsActivity extends Activity {
private ListView listing; private StationsParser sp; private ProgressDialog progress; private StationsAdapter leStationsAdapter;
@Override
publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.filtre_stations); listing = (ListView) findViewById(R.id.listViewFiltreStations);
// a compléter par la définition delaclasseinterne à cetteméthode
// class ChargementDesStationsTache extends AsyncTask<String, String, String>
// ainsique l'instanciation etlelancementdelaméthode execute() // surcette instance
}
}
10°) Déclarer cette activity dans l'.
11°) Indiquer aussi, dans ce fichier , que l'application doit utiliser internet par la ligne :
<uses-permission android:name="android.permission.INTERNET" /> comme fille de l'élément manifest.
12°) Ecrire le code, à l'aide de la classe AsyncTask, qui permet de visionner la liste des stations lorsque l'utilisateur sélectionne le premier item (voir le cours).