Afficher l'image d'origineimageimage                                                       SLAM4 - Réalisation et maintenance de composants logiciels

 

 

TP Java-Android : développement d'une calculatrice

 

 

1- Présentation de l'application à développer

2- Création du projet sous Eclipse

3- Première exécution

4- Création des fichiers ressources

5- Création de l'interface graphique

6- Programmation Java

7- Améliorations à réaliser

 

 

image
 

Ce TP est une adaptation personnelle du tutoriel Android n°6 du site www.tutomobile.fr !

 

 

 

1- Présentation de l'application à développer

 

Cette application consiste en une petite calculatrice proposant les 4 opérations arithmétiques de base :

 

Rectangle: 1 objet Button isolé (sans layout)  Rectangle: 16 objets Button répartis dans 4 layouts horizontaux  Rectangle: Affichage des nombres saisis dans un EditText  image

 


2- Création du projet sous Android

 

Créez le projet, le nommer Android_Calculatrice, choisir la version du SDK souhaitée.

Tester immédiatement l'application sur un émulateur, sur votre téléphone ou une tablette.

 

image

 


 

3- Création des fichiers ressources

 

3-1 Modification du fichier res/values/strings.xml

 

Le répertoire res/values contient un fichier strings.xml contenant différentes chaines utilisées par l'application (il contient initialement 2 chaines hello et app_name) ; double-cliquez sur ce fichier. En mode "text" supprimer la chaine hello pour obtenir :

<resources>
    <
string name="app_name">Calculatrice_Android</string>
    <
string name="action_settings">Settings</string>
</
resources>

Vous pouvez cliquer sur open Editor… pour obtenir l'écran suivant :

 

Rectangle: Le fichier est là...  image

 

Sélectionnez la chaine app_name et modifiez sa valeur (value) en "Calculatrice".

 

Sauvegardez le fichier.

 

 

5- Création de l'interface graphique

 

Un layout correspond à une disposition d'objets graphiques.

 

Le fichier res/layout/nomDeLactivité.xml contient la description de l'interface graphique.

Faites un double-clic sur ce fichier pour l'ouvrir en mode graphique.

 

En sélectionnant un objet de l'interface, on peut vérifier ou régler ses propriétés dans l'onglet Properties situé à droite.

 

 


Dès la création d'un nouveau projet, l'interface comporte un objet RelativeLayout et un objet TextView :

 

Rectangle: L'onglet Properties  Rectangle: Ce TextView est placé dans un RelativeLayout  Rectangle: Le fichier est là...  image

 

On pourrait aussi modifier directement le fichier XML en cliquant sur l'onglet text, mais cette méthode est plus laborieuse :

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />

 

</LinearLayout>

 

Restez dans l'Android layout editor, sélectionnez l'objet TextView, et supprimez-le.

 

Dans la palette, ouvrez le groupe TextFields, choisissez l'objet Plain Text (le premier de la liste) et placez le en haut du layout principal. Puis réglez ses propriétés :

 

·         Id = @+id/editTextAffichage              clic droit sur l'objet et choisir Edit ID... ou Assign ID...

·         Layout width = match_parent           ajuster la largeur de l'objet à celle du layout

·         Layout height = wrap_content          ajuster la hauteur de l'objet au contenu de l'objet

·         Text size = 20dp                                taille des caractères

·         Editable = false                                  empêche la saisie dans la zone

·         Cursor visible = false                        pas de curseur dans la zone

·         Input type = text                                le type de donnée dans la zone

 

Remarque : Match_parent et fill_parent sont sensiblement similaires.


Première rangée de 4 boutons :

 

Dans la palette, ouvrez le groupe Layouts, choisissez l'objet LinearLayout (Horizontal) et placez le sous le TextView. Puis réglez ses propriétés :

 

·         Orientation = horizontal

·         Layout width = match_parent           prendre tout l'espace disponible en largeur

·         Layout height = wrap_content          ajuster la hauteur du layout à son contenu

 

Dans la palette, ouvrez le groupe Form Widgets, choisissez l'objet Button et placez en 4 dans le layout créé à l'étape précédente. Puis réglez leurs propriétés :

 

·         Id = @+id/button1       @+id/button2              @+id/button3              @+id/buttonAddition  

·         Text = "1"                    "2"                                "3"                                "+"

·         Text size = "20dp"

·         Layout width = match_parent          

·         Layout height = wrap_content

·         Layout weight = "1"

 

image            Pour les 3 autres rangées de boutons, vous pouvez rester dans l'éditeur graphique et suivre les

            consignes suivantes, mais vous pouvez aussi passer en mode XML, et recopier 3 fois le code

            correspondant au layout contenant les 4 premiers boutons.

            Il faut alors modifier les propriétés Id et Text de chaque bouton.

 

Deuxième rangée de 4 boutons :

 

Dans la palette, ouvrez le groupe Layouts, choisissez l'objet LinearLayout (Horizontal) et placez le sous le TextView. Puis réglez ses propriétés :

 

·         Orientation = horizontal

·         Layout width = match_parent           prendre tout l'espace disponible en largeur

·         Layout height = wrap_content          ajuster la hauteur du layout à son contenu

 

Dans la palette, ouvrez le groupe Form Widgets, choisissez l'objet Button et placez en 4 dans le layout créé à l'étape précédente. Puis réglez leurs propriétés :

 

·         Id = @+id/button4       @+id/button5              @+id/button6              @+id/buttonSoustraction       

·         Text = "4"                    "5"                                "6"                                "-"

·         Text size = "20dp"

·         Layout width = match_parent          

·         Layout height = wrap_content

·         Layout weight = "1"

 

Troisième rangée de 4 boutons :

 

Dans la palette, ouvrez le groupe Layouts, choisissez l'objet LinearLayout (Horizontal) et placez le sous le TextView. Puis réglez ses propriétés :

 

·         Orientation = horizontal

·         Layout width = match_parent           prendre tout l'espace disponible en largeur

·         Layout height = wrap_content          ajuster la hauteur du layout à son contenu

 

Dans la palette, ouvrez le groupe Form Widgets, choisissez l'objet Button et placez en 4 dans le layout créé à l'étape précédente. Puis réglez leurs propriétés :

 

·         Id = @+id/button7       @+id/button8              @+id/button9              @+id/buttonMultiplication      

·         Text = "7"                    "8"                                "9"                                "*"

·         Text size = "20dp"

·         Layout width = match_parent          

·         Layout height = wrap_content

·         Layout weight = "1"

 

Quatrième rangée de 4 boutons :

 

Dans la palette, ouvrez le groupe Layouts, choisissez l'objet LinearLayout (Horizontal) et placez le sous le TextView. Puis réglez ses propriétés :

 

·         Orientation = horizontal

·         Layout width = match _parent          prendre tout l'espace disponible en largeur

·         Layout height = wrap_content          ajuster la hauteur du layout à son contenu

 

Dans la palette, ouvrez le groupe Form Widgets, choisissez l'objet Button et placez en 4 dans le layout créé à l'étape précédente. Puis réglez leurs propriétés :

 

·         Id = @+id/button0       @+id/buttonPoint        @+id/buttonClear        @+id/buttonDivision   

·         Text = "0"                    "."                                 "C"                               "/"

·         Text size = "20dp"

·         Layout width = match _parent         

·         Layout height = wrap_content

·         Layout weight = "1"

 

Le bouton Egal :

 

Dans la palette, ouvrez le groupe Form Widgets, choisissez l'objet Button et placez en 1 à la suite des 4 layouts créés aux étapes précédentes. Puis réglez ses propriétés :

 

·         Id = @+id/buttonEgal

·         Text = "="

·         Text size = "20dp"

·         Layout width = match _parent         

·         Layout height = wrap_content

 

On peut ensuite utiliser l'onglet main.xml pour vérifier le codage XML du fichier généré :

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

 

    <EditText

        android:id="@+id/editTextAffichage"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:editable="false"

        android:textSize="20dp"

        android:cursorVisible="false"

        android:inputType="text">

 

        <requestFocus />

    </EditText>

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <Button

            android:id="@+id/button1"

            android:text="1"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button2"

            android:text="2"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button3"

            android:text="3"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonAddition"

            android:text="+"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

    </LinearLayout>

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <Button

            android:id="@+id/button4"

            android:text="4"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button5"

            android:text="5"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button6"

            android:text="6"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonSoustraction"

            android:text="-"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

    </LinearLayout>

   

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <Button

            android:id="@+id/button7"

            android:text="7"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button8"

            android:text="8"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/button9"

            android:text="9"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonMultiplication"

            android:text="*"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

    </LinearLayout>

   

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <Button

            android:id="@+id/button0"

            android:text="0"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonPoint"

            android:text="."

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonClear"

            android:text="C"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

 

        <Button

            android:id="@+id/buttonDivision"

            android:text="/"

            android:textSize="20dp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

    </LinearLayout>

   

    <Button

        android:id="@+id/buttonEgal"

        android:textSize="20dp"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="="/>

           

</LinearLayout>

 

Lancez l'exécution de l'application dans l'AVD, suivre le déroulement, et quand l'application est prête, essayez-la :

 

image

 

Pour l'instant, il ne se passe rien quand on clique sur les boutons ; il faut ajouter de la programmation.

 

image            Pour continuer le développement de l'application, n'arrêtez pas l'AVD

            et revenez à la perspective Java.


6- Programmation Java

 

La phase suivante consiste à programmer dans le fichier AndroidCalculatriceActivity.java :

 

package com.android.calculatrice;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

 

public classAndroidCalculatriceActivity extendsActivity {

 

    //On déclare toutes les variables dont on aura besoin

    Button button0, button1, button2, button3, button4, button5, button6, button7, button8, button9;

    Button buttonAddition, buttonSoustraction, buttonDivision, buttonMultiplication;

    Button buttonClear, buttonEgal, buttonPoint;

    EditText ecran;

 

    private double nombre1, nombre2;

    private boolean calculPossible = false;                     // devient true au premier clic sur un opérateur

    private boolean premierChiffreSaisi = false;

    private String operateur= "";

   

    /** Fonction appelée lors de la création de l'activité. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        initialisations();

    }

   

    /** Fonction appelée par l'événement onCrate. */

    public void initialisations() {

        //On récupère tout les éléments de notre interface graphique grâce aux ID

        button0 = (Button) findViewById(R.id.button0);

        button1 = (Button) findViewById(R.id.button1);

        button2 = (Button) findViewById(R.id.button2);

        button3 = (Button) findViewById(R.id.button3);

        button4 = (Button) findViewById(R.id.button4);

        button5 = (Button) findViewById(R.id.button5);

        button6 = (Button) findViewById(R.id.button6);

        button7 = (Button) findViewById(R.id.button7);

        button8 = (Button) findViewById(R.id.button8);

        button9 = (Button) findViewById(R.id.button9);

        buttonPoint = (Button) findViewById(R.id.buttonPoint);

        buttonAddition = (Button) findViewById(R.id.buttonAddition);

        buttonSoustraction = (Button) findViewById(R.id.buttonSoustraction);

        buttonDivision = (Button) findViewById(R.id.buttonDivision);

        buttonMultiplication = (Button) findViewById(R.id.buttonMultiplication);

        buttonClear = (Button) findViewById(R.id.buttonClear);

        buttonEgal = (Button) findViewById(R.id.buttonEgal);

 

        ecran = (EditText) findViewById(R.id.editTextAffichage);

 

        //On attribut un écouteur d'évènement à tout les boutons

        buttonAddition.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                operateurClick("+");

            }

        });

 


        buttonSoustraction.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                operateurClick("-");

            }

        });

 

        buttonDivision.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                operateurClick("/");

            }

        });

 

        buttonMultiplication.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                operateurClick("*");

            }

        });

 

        buttonClear.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                resetClick();

            }

        });

 

        buttonEgal.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                egalClick();

            }

        });

 

        buttonPoint.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick(".");

            }

        });

 

        button0.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("0");

            }

        });

 

        button1.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("1");

            }

        });

 

        button2.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("2");

            }

        });

 

        button3.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("3");

            }

        });

 


        button4.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("4");

            }

        });

 

        button5.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("5");

            }

        });

 

        button6.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("6");

            }

        });

 

        button7.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("7");

            }

        });

 

        button8.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("8");

            }

        });

 

        button9.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                chiffreClick("9");

            }

        });

     }  // fin de la fonction Initialisations

 

    //voici la méthode qui est exécutée lorsque l'on clique sur un bouton chiffre

    public void chiffreClick(String unCaractere) {

        String lesCaracteresAffiches = "";

        if(premierChiffreSaisi == false|| ecran.getText ().equals ("0")){

            premierChiffreSaisi = true;

            lesCaracteresAffiches = unCaractere;

        }else{

           lesCaracteresAffiches = ecran.getText() + unCaractere;

        }

        ecran.setText(lesCaracteresAffiches);

    }

 

    //voici la méthode qui est exécutée lorsque l'on clique sur un des 4 opérateurs

    public void operateurClick(String unOperateur){

        if(calculPossible){

            calcul();

            ecran.setText(String.valueOf(nombre1));

        }else{

            nombre1 = Double.valueOf(ecran.getText().toString()).doubleValue();

            calculPossible = true;

        }

        operateur = unOperateur;

        premierChiffreSaisi = false;

    }


     //voici la méthode qui est  exécutée lorsque l'on clique sur le bouton =

    public void egalClick(){

        calcul();

        premierChiffreSaisi = false;

        calculPossible = false;

    }

 

    //voici la méthode qui est  exécutée lorsque l'on clique sur le bouton C (Clear)

    public void resetClick(){

         calculPossible = false;

         premierChiffreSaisi = false;

         nombre1 = 0;

         operateur = "";

         ecran.setText("");

    }

 

    //Voici la méthode qui fait le calcul qui a été demandé par l'utilisateur

    private void calcul(){

        nombre2 = Double.valueOf(ecran.getText().toString());       

        if(operateur.equals("+")){

            nombre1 = nombre1 + nombre2;           

            ecran.setText(String.valueOf(nombre1));

        }

        if(operateur.equals("-")){

            nombre1 = nombre1 - nombre2

            ecran.setText(String.valueOf(nombre1));

        }

        if(operateur.equals("*")){

            nombre1 = nombre1 * nombre2

            ecran.setText(String.valueOf(nombre1));

        }

        if(operateur.equals("/")){

            try{

                nombre1 = nombre1 / nombre2

                ecran.setText(String.valueOf(nombre1));

            }catch(ArithmeticException e){

                ecran.setText("0");

            }

        }

    }

}

 

 

Lancez l'exécution de l'application dans l'AVD, passer en perspective DDMS pour suivre le déroulement, et quand l'application est prête, testez différentes opérations.

 

 

7- Améliorations à réaliser (liste non exhaustive…)

 

·         Modifier l'icône de l'application (chercher la méthode sur Internet)

 

·         Empêcher de taper un deuxième point décimal dans un nombre.

 

·         Ne pas effectuer de calcul quand on clique une nouvelle fois sur le bouton = sans avoir tapé de nouvelle valeur (essayez de taper la séquence 3 + 4 = = = pour constater le problème).

 

·         Ne pas effectuer de calcul quand on clique sur le bouton = sans avoir saisi un nombre, ou après avoir cliqué sur le bouton Clear.

 

·         Empêcher de commencer la saisie par un opérateur * ou / ; on peut par contre commencer la saisie avec un + ou un – pour préciser le signe de la valeur. Dans ce cas, il faut traiter le + et le – comme des chiffres et non pas comme des opérateurs.