IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Codage insuffisant - ! Conseils !@!


Sujet :

Android

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut Codage insuffisant - ! Conseils !@!
    bonjour ,

    Pas d'erreur de syntaxe sur les lignes suivantes , mais il n'y a que
    Button Resist qui calcule R=T/I

    Button Intens ( I =T/R ) , Button Tension ( T=R*I ) ne sont pas actif
    et ne déclenchent rien dans le champs text correspondant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    package msi_ubuntu.multimetre;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
     
    import static msi_ubuntu.multimetre.R.layout;
     
    public class MainActivity extends Activity {
     
        //On déclare toutes les variables dont on aura besoin
        Button buttonR;
        Button buttonT;
        Button buttonI;
        EditText ecranR;
        EditText ecranT;
        EditText ecranI;
     
     
        /**
         * Activité de l'interface graphique
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(layout.activity_main);
     
            //On récupère tous les éléments de notre interface graphique grâce aux ID
            // ******** DEFINITION DES CONSTANTES ET VARIABLES  ********************
            Button Resist = (Button) findViewById(R.id.button);
            Button Tension = (Button) findViewById(R.id.button2);
            Button Intens  = (Button) findViewById(R.id.button3);
            final EditText EcranR = (EditText) findViewById(R.id.editText);
            final EditText EcranT = (EditText) findViewById(R.id.editText2);
            final EditText EcranI = (EditText) findViewById(R.id.editText3);
     
            // ***************  ATTRIBUT  *************************
            //On attribue un écouteur d'évènement à bouton R=T/I
            Resist.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    double result= new Double(EcranT.getText().toString())
                        / new Double(EcranI.getText().toString());
                    EcranR.setText(Double.toString(result));
                }
            });
            //On attribue un écouteur d'évènement à bouton T=R*I
            Tension.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    double result= new Double(EcranR.getText().toString())
                            * new Double(EcranI.getText().toString());
                    EcranT.setText(Double.toString(result));
                }
            });
            //On attribue un écouteur d'évènement à bouton I=T/R
            Intens.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    double result= new Double(EcranT.getText().toString())
                            / new Double(EcranR.getText().toString());
                    EcranI.setText(Double.toString(result));
                }
            });
        }
     
    }

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ma première idée serait de dire: "et ça donne quoi en pas à pas ?"
    (parce que bon, avoir un debugueur c'est cool, mais il faut l'utiliser )


    Ensuite, le choix des noms de variable.
    En java, seuls les types (Classes, Interfaces et Enum) commencent par une majuscule. Tous les autres noms doivent commencer par une minuscule (cela évite les erreurs de relecture, j'ai bloqué 10 minutes en lisant "Intent" au lieu de Intens).


    Les variables privées buttonX et ecranY ne sont jamais utilisées... est-ce voulu ? Parce que c'est dommage je pense.


    Pour finir, voici comment j'aurai codé le truc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    // A noter que l'activité sera un click listener elle-même... plus simple à gérer à mon avis.
    public class MainActivity extends Activity implements View.OnClickListener {
     
        //On déclare toutes les variables dont on aura besoin (mais on n'a pas besoin des boutons !)
        EditText ecranR;
        EditText ecranT;
        EditText ecranI;
     
     
        /**
         * Activité de l'interface graphique
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(layout.activity_main);
     
            //On récupère tous les éléments de notre interface graphique grâce aux ID (et on les stocke si besoin dans les variables préparées pour). J'aime bien préfixer par "this." pour bien spécifier qu'on parle des valeurs de *cette* instance de la classe.
            this.ecranR = (EditText) findViewById(R.id.editText);   // <= par soucis de cohérence, il serait bon de renommer ce champ de texte en "editText1"
            this.ecranT = (EditText) findViewById(R.id.editText2);  // l'idéal aurait quand même été de choisir R.id.editResistance,  R.id.editTension  et R.id.editIntensite
            this.ecranI = (EditText) findViewById(R.id.editText3);
     
            // ensuite on cré
            ((Button) findViewById(R.id.button)).setOnClickListener(this);   // <= par soucis de cohérence, il serait bon de renommer ce bouton en "button1" 
            ((Button) findViewById(R.id.button2)).setOnClickListener(this); // là encore l'idéal aurait été de choisir R.id.btnResistance,  R.id.btnTension  et R.id.btnIntensite
            ((Button) findViewById(R.id.button3)).setOnClickListener(this);
        }
     
     
     
        public void onClick(View view)
        {
             double resistance = (this.ecranR.getText().length() > 0) ? Double.parseDouble(this.ecranR.getText().toString()) : 0.0;  // sinon on aura un crash si le champ est vide !
             double tension = (this.ecranT.getText().length() > 0) ? Double.parseDouble(this.ecranT.getText().toString()) : 0.0;
             double intensite = (this.ecranI.getText().length() > 0) ? Double.parseDouble(this.ecranI.getText().toString()) : 0.0;
     
             switch (view.getId()) {
                case R.id.button:   // on calcule la résistance.
                       resistance = (intensite > 0.0) ? tension / intensite : 0.0;  // on évite quand même les cas simple d'erreur !
                       this.ecranR.setText(Double.toString(resistance));
                       break;
                case R.id.button2:   // on calcule la tension.
                       tension = resistance * intensite;
                       this.ecranT.setText(Double.toString(tension ));
                       break;
                case R.id.button3:   // on calcule l'intensité.
                       intensite = (resistance > 0.0) ? tension / resistance : 0.0;
                       this.ecranI.setText(Double.toString(intensite));
                       break;
                default:
                       break;
                }
         }
     
     
    }

    Attention au "boxing/unboxing"... (ouais je sais c'est barbare comme nom, mais je m'explique):
    L'opérateur "/" (comme tous les opérateurs mathématiques en Java) ne fonctionne que sur les types "simples" (fondamentaux): int, long, short, byte, float, double.
    new Double(xxxxx) crée un objet de type "Double" (rien à voir ou presque avec le type simple "double").
    Avant Java 1.6 le compilateur aurait alors râlé sur "new Double(xxxx) / new Double(yyy)" mais ce n'est plus le cas, il va effectuer un "auto-unboxing", à savoir transformer l'objet "Double" en type simple "double". Donc ce code revient à (de manière silencieuse).
    (new Double(xxxx)).doubleValue() / (new Double(yyyy)).doubleValue()

    Hors... la construction d'un objet de type "Double" se fait simplement par l'utilisation d'un "double", ou va d'abord transformer l'objet passé en "double".
    Donc.... (new Double(xxx)).doubleValue() est équivalent à: (new Double(Double.parseDouble(xxx)).doubleValue())
    Soit une création d'objet complètement inutile
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok , merci , je vais voir cela de plus près ..

    La source vient de :
    Android
    Apprendre à programmer des applis
    Geodif
    Stefan Schwark
    1er Edition / 3em Tirage / 2013

    C'est la première appli , page 50/200
    (le codage est plus réduit que cela dans ce livre ! )


  4. #4
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Résultat du codage :

    Il n'y que le button "resistance" qui fonctionne , les deux autres ne calculent rien !

    // A noter que l'activité sera un click listener elle-même... plus simple à gérer à mon avis.
    public class MainActivity extends Activity implements View.OnClickListener {
    Stefan Schwark ne fait pas ce choix , mais cela ne fonctionne pas aussi .

    Un log avec crash , en page 145 ( fichier audio ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        --------- beginning of crash
    11-26 09:40:22.566      906-906/msi_ubuntu.musik E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: msi_ubuntu.musik, PID: 906
        android.content.res.Resources$NotFoundException: Resource ID #0x1388
                at android.content.res.Resources.getValue(Resources.java:1233)
                at android.content.res.Resources.loadXmlResourceParser(Resources.java:2598)
                at android.content.res.Resources.getLayout(Resources.java:1049)
                at android.view.MenuInflater.inflate(MenuInflater.java:107)
                at msi_ubuntu.musik.MainActivity.onCreateOptionsMenu(MainActivity.java:131)
                at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
                at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:548)
                at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:917)
                at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:258)
                at android.os.Handler.handleCallback(Handler.java:739)
                at android.os.Handler.dispatchMessage(Handler.java:95)
                at android.os.Looper.loop(Looper.java:135)
                at android.app.ActivityThread.main(ActivityThread.java:5221)
                at java.lang.reflect.Method.invoke(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:372)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    11-26 09:45:21.674      906-906/msi_ubuntu.musik I/Process﹕ Sending signal. PID: 906 SIG: 9
    Dans ce cas le terminal virtuel de Android n'affiche pas l'icône de l'application .

    Nom : andr_1.jpg
Affichages : 70
Taille : 24,8 Ko

    .........................................................................................

    Nom : andr_2.jpg
Affichages : 86
Taille : 70,7 Ko

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/01/2003, 07h55
  2. [Accents - XML] Problème de codage non supporté !!
    Par Smortex dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/11/2002, 11h00
  3. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  4. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo