Application "fiche de contact"

Logo de l'application
Nous allons développer une application qui permet de gérer une fiche de contact. Pour cela nous allons passer par plusieurs étapes :
  • Définition de l'interface (première version).
  • Implémentation des fonctionnalités.
  • Amélioration de l'interface.
  • Sauvegarde en base de donnée.

Interface graphique

  • Le layout de base : ConstraintLayout.
  • Définition de guides :
    • Un horizontal à 20% (0.2)
    • Un vertical à 40%
    • Un vertical à 50%
  • L'image principale est centrée horizontalement, et le haut et le bas alignés sur le guide horizontal.
  • La petite image est alignée en bas à droite de l'image principale.
  • L'EditText (firstName) est en dessous de l'image, sa gauche est à gauche du parent (avec une marge) et sa droite alignée avec le premier guide.
  • L'EditText (Name) est en dessous du précédent, avec les mêmes alignements.
  • Le Spinner, est sur le même concept, sauf que son alignement vertical est basé sur l'EditText du numéro de téléphone.
  • L'EditText (date de naissance) est au même niveau que le champ firstName, alignée à droite sur le parent, à gauche sur le second guide, avec une marge à droite.
  • Le Textview qui affiche l'age est en dessous du précédent champ et sa droite est alignée avec le champ précédent.
  • Le favori est en haut à droite du parent.
  • Le bouton de sauvegarde est en bas du parent, aligné horizontalement au centre.

Détail de la vue

Implémentation des fonctionnalités

Nous allons implémenter plusieurs fonctionnalités :
  • Le changement d'état du bouton favoris.
  • Le choix d'une image dans la galerie d'images.
  • Le choix de la date avec un DatePicker.
  • Calcul de l'age avec la date de naissance.
  • Choix du type de numéro de téléphone avec un Spinner.
  • Gestion du bouton "save".

Le bouton favoris

Nous allons suivre les étapes suivantes :
  • Nous allons déclarer une variable de type boolean afin de sauvegarder l'état du bouton favoris.
  • En fonction de la valeur, sur le click nous allons changer la valeur de l'image :
    • @android:drawable/btn_star_big_on
    • @android:drawable/btn_star_big_off

Choix d'une image dans la galerie

Nous allons suivre les étapes suivantes :
  • Déclenchement de l'intent adéquat lors du click sur l'image en bas à droite.
  • Récupération de l'image lors du retour de l'acitivité galerie.

Pour faciliter la tâche, deux LiveTemplates sont mis à disposition :
  • android_intent_select_picture_in_gallery : à lancer dans le onClick.
  • android_intent_select_picture_in_gallery_result : à lancer (comme indiqué dans la première étape, en dehors d'une méthode, mais dans la classe.

Le choix de la date avec un DatePicker

Nous allons suivre les étapes suivantes :
  • Déclencher l'affichage du DatePicker.
  • Afficher le DatePicker.
  • Récupérer la date sélectionnée.

Déclencher l'affichage du DatePicker


etBirthday = findViewById(R.id.activity_edit_editText_birthday);
etBirthday.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        displayDatePicker();
    }
});

etBirthday.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            displayDatePicker();
        }
    }
});
                
Les deux méthodes sont utilisées simultanément pour pouvoir gérer les réaction différentes des versions d'Android.

Afficher le DatePicker


private void displayDatePicker() {
    DatePickerDialog dpd = new DatePickerDialog(EditActivity.this);
    dpd.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            // TODO: do something with the selected date
        }
    });
    dpd.show();
}
Ne pas oublier d'appeler la méthode show().

Récupérer la date sélectionnée


if (BuildConfig.DEBUG) {
Log.d(TAG, "onDateSet " + year + " " + month + 1 + " " + dayOfMonth);
}
etBirthday.setText(dayOfMonth + "/" + (month + 1) + "/" + year);

Que proposez vous pour améliorer le code ci-dessus ?

Calcul de l'age avec la date de naissance

Avec la date sélectionnée, nous allons calculer l'age correspondant. Nous allons suivre les étapes suivantes :

LocalDate today = LocalDate.now();
LocalDate birthDay = LocalDate.of(year, month+1, dayOfMonth);

tvAge.setText(Period.between(birthDay, today).getYears() + " ans");
                

Que proposez vous pour améliorer le code ci-dessus ?

Choix du type de numéro de téléphone avec un Spinner

Nous allons utiliser le LiveTemplate : android_spinner_string_array dans la méthode onCreate et suivre les étapes indiquées.

Gestion du bouton "save"

Nous allons dans un premier temps simplement afficher un Toast et fermer l'Activity avec la méthode :

finish();
                

Amélioration de l'interface

Nous allons effectuer les améliorations suivantes :
  • Mettre un fond en dégradé.
  • EditText en matérial design.
  • Button en matérial design.
  • Afficher l'image en cercle : https://github.com/hdodenhof/CircleImageView.

Fond en dégradé

Nous allons suivre les étapes suivantes :
  • Ajoutons un fichier : res/drawable/background.xml (Click droit sur le dossier, New/Drawable resource file).
  • Remplir avec le code ci-dessous.
  • Définit le fond de la vue avec cette nouvelle ressource.

                    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
            android:angle="90"
            android:endColor="#FAFAFA"
            android:startColor="#AAAAAA"
            android:type="linear" />
</shape>

Que proposez vous pour améliorer le code ci-dessus ?

EditText en matérial design

Nous allons suivre l'étape suivante :
  • Utiliser le LiveTemplate android_xml_material_design_edittext pour remplacer l'EditText original (en gardant le même id).

Button en matérial design

Nous allons suivre l'étape suivante :
  • Utilisons le LiveTemplate android_xml_material_design_button pour remplacer le Button original (en gardant le même id) .

Afficher l'image en cercle

Nous allons suivre les étapes suivantes :
  • Allons sur la page de la librairie : CircleImageView.
  • Suivons les consignes :
    • Ajoutons la dépendance dans notre fichier gradle.
    • Remplaçons notre ImageView par la vue de type : CircleImageView

Sauvegarde en base de donnée

Nous allons suivre les étapes suivantes :
  • Utilisons le LiveTemplate android_db_room_00_documentation n'importe ou, et suivre les instructions.
  • Dans la classe : AppDatabase retirons le commentaire de la ligne .allowMainThreadQueries ().
  • Nous pouvons maintenant utiliser l'enregistrement et la récupération des informations
  • .
Récupération des données dans la base de donnée :

List<User> userList = AppDatabase.getDatabase(getBaseContext()).userDao().getAll();
Enregistrement des données dans la base de donnée :

User currentUser = new User("Tristan", "SALAUN", "H", "Mobile", "+3361234567", "29/03/1979", "IMAGE");
AppDatabase.getDatabase(getBaseContext()).userDao().insert(currentUser);