Chapitre 2
PLACEMENT DES VUES
 
 
Précédent Suivant
 

Placement des vues
Exercice: calculatrice
Organisation des vues (1/2)
* Plusieurs manières de placer les vues
* FrameLayout: zone réservée pour une vue
* LinearLayout: placement en ligne ou en colonne des vues
* TableLayout: placement des vues dans un tableau
* RelativeLayout: placement des vues les unes par rapport aux autres
* GridLayout: placement des vues dans une grille
* Dimensionnement
* Même taille que le parent: layout_width = "match_parent"
* Adaptation au contenu: layout_width = "wrap_content"
* Répartition de l'espace libre: layout_weight
* Exemple: répartition ¾ - ¼
* Composant 1: layout_weight = "3"
* Composant 2: layout_weight = "1"
* Ne pas oublier: layout_width = "0dp"
Organisation des vues (2/2)
* Séparer l'écran en deux
* Afficheur: TextView
* layout_height = "wrap_content"
* Identifiant: "afficheur"
* Touches: LinearLayout (horizontal)
* layout_height = "0dp"
* layout_weight = "1"
* Séparer la zone inférieure
* Répartition ¾ - ¼
* Gauche: LinearLayout (vertical)
* Contient 4 "LinearLayout" horizontaux
* Droite: LinearLayout (vertical)
* Couleur de fond
* Exemple: background = "#00FF00"
Placement des boutons
* Placer les touches dans les "LinearLayout"
* Classe "Button"
* Utiliser le système de répartition (layout_weight)
* Possibilité de personnalisation
* textSize = "40dp"
* textColor = "#FFFFFF"
* background = "#00FF00"
* Image de fond
* Ajouter une image dans les ressources [app / res / drawable]
* Copier l'image à partir de l'explorateur de fichiers
* Coller l'image dans le dossier "drawable" de l'environnement
* Attention au nom: a-z, A-Z, 0-9, _ uniquement
* Utiliser l'image dans la maquette d'activité
* Exemple: background = "@drawable/nom_image"
Gestion des événements (version 1)
* Objectif: afficher la touche appuyée dans l'afficheur
* Créer un écouteur
* Dans la classe "MainActivity"
* public void saisir(View vue) { [...] }
* Associer l'écouteur à chaque bouton
* Attribut "onClick" dans la maquette d'activité
* Dans l'écouteur...
* Récupérer le bouton déclencheur (vue passée en argument)
* Button bouton = (Button)vue;
* Récupérer le 1er caractère du texte du bouton
* char touche = bouton.getText().charAt(0);
* Récupérer l'afficheur
* TextView afficheur = findViewById(R.id.afficheur);
* Mettre le caractère du bouton dans l'afficheur
* afficheur.setText("" + touche);
Gestion des événements (version 2)
* Objectif: afficher toute la séquence de touches appuyées
* Créer une classe "Calculatrice" pour le code "métier"
* Elle gèrera les calculs et l'affichage
* Elle possède une chaîne de caractères de l'affichage
* A chaque appui sur une touche, elle doit mettre à jour cette chaîne
* Créer un objet "Calculatrice" dans l'activité
* Déclarer un attribut "calc_" dans la classe "MainActivity"
* Initialiser l'attribut dans la méthode "onCreate" qui lance l'activité
* Dans l'écouteur...
* Construire la chaîne d'affichage de la calculatrice
* En fonction du caractère, appeler une méthode de la calculatrice
* Méthode "chiffre": lorsqu'un chiffre est saisi
* Méthode "virgule": lorsqu'une virgule est saisie
* Méthode "operation": lorsqu'une opération (+, -, *, /, =) est saisie
* Copier la chaîne d'affichage de la calculatrice dans l'afficheur
Code (simplifié) de la calculatrice
public class Calculatrice {
private String affichage_; // Attribut
public String getAffichage() { [...] } // Accesseur
public Calculatrice() { [...] } // Constructeur
public void chiffre(int n) { /* Gestion chiffre */ }
public void virgule() { /* Gestion virgule */ }
public void operation(char o) { /* Gestion opération */ }
}
Véritable calculatrice (1/4)
* Objectif: faire des calculs comme une vraie calculatrice
* 1ère étape: construire le nombre saisi
* Attribut "courant_"
* Pour chaque chiffre: courant_ = 10*courant_ + chiffre
* Attention à la virgule
* Deux attributs sont nécessaires
* virgule_: booléen qui indique s'il y a une virgule
* coef_: position de la virgule (nombre à multiplier à "courant_")
Véritable calculatrice (2/4)
* Compléter la classe "Calculatrice" en conséquence
* Ajouter les attributs (penser au constructeur)
* Adapter les méthodes "chiffre" et "virgule"
* Utiliser l'opération "=" pour tester le nombre saisi
* Ecraser l'affichage
* Mettre à la place le nombre contenu dans "courant_"
* Après l'opération, l'affichage repart avec un nouveau nombre
* Attribut "reset_": indique s'il faut réinitialiser l'affichage
* Méthode "raz": procède à une remise à zéro de l'affichage
* Remarque: plusieurs attributs doivent être réinitialisés
* Déclencher "raz" au début des méthodes "chiffre" et "virgule"
Véritable calculatrice (3/4)
* 2ème étape: appliquer les opérations de calcul
* Quand on appuie sur une touche d'opération,
c'est l'opération précédente qui est exécutée
* Entre le nombre courant et le nombre précédemment saisi
* Exemple
* 1 ==> courant_ = 1
* 5 ==> courant_ = 15
* + ==> operation_ = '+' / memoire_ = 15
* 3 ==> courant_ = 3
* + ==> memoire_ = memoire_ + courant_
==> (car "operation_" vaut '+')
Véritable calculatrice (4/4)
* Il faut donc mémoriser l'opérande gauche et l'opération
* Attribut "memoire_": nombre précédant celui en cours de saisie
* Attribut "operation_": dernière opération demandée
* Pour appliquer l'opération quand l'opérande droite est saisie
* C'est-à-dire quand une autre opération est demandée
* Donc: quand une opération est demandée
* Executer "operation_" entre "memoire_" et "courant_"
* Remarque: prévoir le démarrage d'un calcul ==> operateur_ = '?'
* Remarque: cas division par 0 ==> message d'erreur
Responsive Design (1/2)
* Proposer une maquette pour le mode paysage
* Se placer dans le dossier des maquettes [app / res / layout]
* Créer une nouvelle maquette [New / Layout resource file]
* Même nom que la maquette mode portrait
* Choisir les conditions d'utilisation de la maquette alternative
* Orientation, taille...
* Exemple: Orientation / Landscape
* Sélection automatique de la meilleure maquette
* En fonction de l'orientation
* Créer la maquette de l'activité pour le mode paysage
* Faire un copier-coller du mode portrait
* Ajouter un layout pour une séparation gauche-droite
* Gauche: calculatrice (copie du contenu mode portrait)
* Droite: historique ("ScrollView" contenant "TextView")
Responsive Design (2/2)
* Historique: mettre des identifiants sur les éléments
* Scroll: "scroll"
* Zone de texte: "historique"
* Dans l'écouteur...
* Récupérer la zone de texte de l'historique
* TextView histo = findViewById(R.id.historique);
* Si cette zone existe, affichage de l'historique
* if (histo != null) histo.setText(calc.getHistorique());
* Régler le défilement automatique du scroll
* ScrollView scroll = findViewById(R.id.scroll);
* if (scroll != null) scroll.fullScroll(View.FOCUS_DOWN);