L'indice de masse corporelle (IMC, en anglais Body Mass Index, BMI) est une grandeur qui permet d'estimer la corpulence d'une personne. Elle a été inventée par Adolphe Quetelet, scientifique belge fondateur de la statistique moderne; cet indice est aussi appelé indice de Quetelet.
Cet indice se calcule en fonction de la taille et de la masse. Bien qu'il ait été conçu au départ pour les adultes de 18 à 65 ans, de nouveaux diagrammes de croissance ont vu le jour au cours des dernières décennies pour les enfants de 0 à 18 ans. Dans les deux cas, il constitue une indication et intervient dans le calcul de l'IMG. (source Wikipedia)
L'IMC est égale à
Compléter le projet fourni en vous basant sur les fonctionnalités que vous déduirez de l'application de démonstration. Vous penserez à internationaliser l'application pour le français et l'espagnol.
Description textuelle du \textit{déroulement type} d'une utilisation de cette application :
- l'utilisateur saisi son nom et son prénom,
- l'utilisateur saisi sa date de naissance,
- l'utilisateur saisi son poids,
- l'utilisateur saisi sa taille en centimètres ou en mètre(s). Il devra indiqué le mode choisi gr^ace au bouton radio de l'interface afin que le calcul de l'IMC se fasse correctement.
- l'utilisateur appuie sur la touche
Calculer, le résultat s'affiche dans une autre activité. - lorsque l'utilisateur appuie sur le bouton
backde l'application (pas celle du terminal), un historique est affiché en bas de la première activité sous forme de liste (RecyclerView).
De plus :
- A tout moment l'utilisateur pourra appuyer sur le bouton
RAZpermettant d'effacer toutes les informations déjà saisies. - Toutes les erreurs sont indiquées par des Toasts appropriés (par exemple, demande de calcul sans avoir entré les informations nécessaires etc.)
Avant de commencer !
Vous disposez :
- d'une application de démonstration sous forme d'archive APK à installer sur l'émulateur.
Pour installer l'application sur émulateur ou terminal physique (pour simplifier un seul devra être connecté) :
- Lancer l'émulateur ou connecter le terminal physique
adb devices: Permet d'afficher les terminaux connecté à l'ordinateuradb install nom_archive.apk: Installe l'application sur le terminal
- d'une documentation sur les parcelables (on vous demande de comprendre l'intérêt des parcelables et non de les développer)
- d'un certain nombre de classes (déjà intégrées au projet Android Studio) et qu'il ne faudra pas modifier :
FicheIMC: classeParcelable(c'est à dire, dont les instances sont "transportables" par unIntenten tant que données extras peut-être utilisée pour assurer une communication à l'intérieur d'une application entre activités.
Un
Intentpourra, par exemple, transporter une instance de cette classe en tant que données extras.
🎯 En d'autres termes, toutes ces ressources vous permettent de vous concentrer sur les notions abordées lords des cours.
📝 Je vous conseille de bien étudier les sources Java et les ressources XML !
Question 1 : Versionnage de votre développement
- cloner le présent dépôt et vous l'approprier dans votre propre dépôt git.
- inscrire en première ligne du fichier
README.mdvotre nom, prenom et groupe - créer votre propre dépôt privée et pusher le projet initial en tant que branche
main - inscrire votre enseignant comme participant à votre déopôt git
Question 2 : Traduire l'application en français et en espagnol
- créer la branche
traduction_dev - traduire votre application en français et en espagnol
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Question 3 : Compléter les layouts pour que les interfaces utilisateurs ressemblent à celles de l'application de démonstration.
- créer la branche
layouts_dev - développer les layouts
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Question 4 : Complétez les classes Java pour permettre la saisie correcte des informations et la préparation correcte de l'intention
Note : On se place juste au point qui précède de lancement de l'activité cible.
- créer la branche
dev_input_activity - développer les fonctionnalités demandées
- utiliser le mode déboggage pour vous assurer que l'intention est correctement péparée
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Question 5 : Complétez les classes Java pour permettre le calcul de l'IMC, son affichage dans l'activité cible et la préparation de l'intention de résultat
Note : On se place juste au point qui précède de la teerminaison de l'activité cible.
- créer la branche
dev_calcul_and_print_imc - développer les fonctionnalités demandées
- utiliser le mode déboggage pour vous assurer que l'intention de résultat est correctement péparée
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Question 6 : Finaliser le développement de votre application
Note : On se place juste au point qui précède de la teerminaison de l'activité cible.
- créer la branche
finalise_dev - développer les fonctionnalités demandées
- utiliser le mode déboggage pour vous assurer que l'intention de résultat est correctement péparée
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Nous souhaitons faire évoluer l'application pour qu'un historique soit affiché dans l'activité développée dans la branche git dev_input_activiy sous forme d'une RecyclerView à la place de la TextView.
Compléter le projet fourni en vous basant sur les fonctionnalités que vous déduirez de l'application de démonstration.
Avant de commencer !
Vous disposez :
- d'une application de démonstration sous forme d'archive APK à installer sur l'émulateur.
Pour installer l'application sur émulateur ou terminal physique (pour simplifier un seul devra être connecté) :
- Lancer l'émulateur ou connecter le terminal physique
adb devices: Permet d'afficher les terminaux connecté à l'ordinateuradb install nom_archive.apk: Installe l'application sur le terminal
- de supports de cours pour découvrir la
RecyclerView - des sources de l'application abordée dans le cours les supports de cours sous la forme d'un dépôt git
- créer la branche
dev_recyclerview_feature - développer les fonctionnalités demandées
- effectuer un pull request (ne pas effacer cette branche après l'accepation de de la demande de pull request)
Quelques indications :
- Ajouter la dépendance permettant l'utilisation du composant graphique
RecyclerView(fichierbuild.gradledu module):
implementation "com.android.support:recyclerview-v7:24.0.0"- Synchroniser votre gradle pour tenir compte de la modification.
- Mettre à jour le layout
activity_main.xmlpour que ce soit uneRecyclerViewqui soit utilisé - Créer le layout
content_cell.xmlqui décrit une cellule (ligne) de laRecyclerView; voici une ébauche à compléter :
<?xml version="1.0" encoding="utf-8"?>
<!--
Layout pour une ligne de la RecyclerView
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp"
android:layout_margin="10dp"
android:background="@android:color/holo_blue_light"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@string/last_name" />
<TextView
android:id="@+id/tv_last_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
"- Créer une classe
recyclerview.IMCViewHolderen partant de l'ébauche suivante :
public class IMCViewHolder extends RecyclerView.ViewHolder {
private final TextView _tvLastName=null;
private final TextView _tvBirthday=null;
private final TextView _tvIMC=null;
/**
* Instancie un ViewHolder et le rattache à une cellule (View)
*
* @param cell (View) : cellule à laquelle il faut rattacher
* le ViewHolder
*/
public IMCViewHolder(View cell) {
super(cell);
// Désérialisation des componsants graphiques d'une cellule
// A compléter
}
/**
* Méthode utilitaire qui permet de remplir les champs de la cellule
* courante avec les informations qui lui est destinée (issue de l'Adapter)
*
* @param ficheIMC (FicheIMC) : fiche IMC qui devra "remplir la cellule"
*/
public void printFicheIMCInCell(FicheIMC ficheIMC) {
// Met à jour la cellule de la RercyclerView avec les données issues de la ficheIMC
// A compléter
}
}- Créer une classe
recyclerview.AdaptarIMCen partant de l'ébauche suivante :
public class AdapterIMC extends RecyclerView.Adapter <IMCViewHolder> {
/**
* Contexte de l'Activity auquel est rattaché le RecyclerView
*/
private Context _context;
/**
* Représente les informations que devra visualiser
* la ListView qui sera rattachée à l'Adapter
*/
private ArrayList<FicheIMC> _listeFicheIMC;
/**
* Constructeur de l'Adapter
*
* @param context (Context) : Contexte de l'Activity auquel est rattaché
* le RecyclerView
* @param listeFicheIMC (ArrayList<FicheIMC) : Liste des ficheIMC qui
* "alimenteront" le RecyclerView
*/
public AdapterIMC(Context context, ArrayList<FicheIMC> listeFicheIMC) {
// A compléter
/**
* Notifie au RecyclerView qu'il doit se rafraichir
*/
notifyDataSetChanged();
}
/**
* Permet de créer les cellules visibles
* Est appelé une seule fois
* @param parent (ViewGroup) : Parent auquel sera ajouté la cellule qui
* va être crée
* @param viewType
* @return (IMCViewHolder) : Cellule qui est crée et initialisée
*/
@Override
public IMCViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
/**
* Déserialisation de la cellule
* La valeur false permet de ne pas rattacher la cellule directement
* au parent, mais de laisser cette responsabilité au RecyclerView
*/
View cell = null;
// A ccompléter
/**
* Remplissage de la cellule
*/
IMCViewHolder ficheIMCViewHolder = null;
// A compléter
return ficheIMCViewHolder;
}
/**
* Permet de remplir les cellules visibles
* @param holder (ContactViewHolder) : cellule à remplir
* @param position (int) : position de la cellule dans la liste
*/
@Override
public void onBindViewHolder(IMCViewHolder holder, int position) {
// A compléter
}
/**
* Nombre total de cellules (visibles et non visibles) du RecyclerView
* @return (int) : Nombre total de cellules présentes dans le RecyclerView
*/
@Override
public int getItemCount() {
int itemCount = 0;
if (this._listeFicheIMC !=null){
itemCount = this._listeFicheIMC.size();
}
return itemCount;
}
// Ajoute une ficheIMC
public void addFicheIMC(FicheIMC ficheIMC){
this._listeFicheIMC.add(ficheIMC);
notifyDataSetChanged();
}
} // Fin de la classe ContactsAdapter- Modifier la classe
MainActivityen appuyant de l'ébauche suivante
/**
* Saisie des informations de l'utilisateur
* Affichage de l'historique des informations et des IMCs calculés
*
* @author B. LEMAIRE
* @version 2023
*/
public class MainActivity extends Activity {
public static final String FICHE_IMC = "fiche_imc"; /* clef pour l'envoie de la fiche IMC en
tant qu'extra d'un intent */
private static final int REQ_IMC = 1; /* Code de requête pour le résultat de
retour d'une activité */
// Champs de saisis des informations
private EditText ed_nom = null;
private EditText ed_prenom = null;
private EditText ed_poids = null;
private EditText ed_taille = null;
// Permet de saisir la date de naissance
private DatePicker date_picker = null;
// Groupe raido pour saisir l'unité de la taille (mètre ou centimètre)
private RadioGroup group = null;
// Liste des ficheIMC
private RecyclerView _rv_ficheIMC = null;
private AdapterIMC adapterIMC = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
/**
* Instanciation de l'Adapter qui alimentera le RecyclerView
*/
// A compléter
/**
* Association du RecyclerView avec son Adaptateur qui l'alimentera avec
* les ficheIMC
*/
// A compléter
}
private void deserialiserRessource() {
// ...
// Desérialisation du RecyclerView
// A compléter
}
// ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// A compléter
super.onActivityResult(requestCode, resultCode, data);
}
// ...
}