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

Composants graphiques Android Discussion :

[Problème] Erreur placement aléatoire de boutons


Sujet :

Composants graphiques Android

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [Problème] Erreur placement aléatoire de boutons
    Bonjour !

    Je dois, dans le cadre de l'ISN (matière de découverte de l'informatique en terminale S), préparer une application toute simple sous Android.
    Celle-ci est une interface de compte bancaire.

    Je m'explique :

    Elle ne contient qu'une seule fenêtre, sur laquelle se trouvent un champ pour rentrer le numéro de compte bancaire (enregistré dans l'application), et un tableau de 5 par 5, constitué de boutons, dont dix d'entre eux sont numérotés de 0 à 9. Ceux-ci doivent prendre une valeur aléatoirement à chaque ouverture du programme.

    Bref, mon application se ferme dès son lancement sur émulateur, et je ne comprend vraiment pas pourquoi...
    Si quelqu'un aurait une petite idée, voici le code source Java de l'application en question :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    package com.example.tableau;
     
    import java.util.Random;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.EditText;
    import android.view.View.OnClickListener;
     
     
    public class MainActivity extends Activity implements OnClickListener {
    	final CharSequence numBonCompte = "2401951802", bonCode = "1995";
    	CharSequence codeEcrit = "";
    	Button button[][] = new Button[5][5], valid = null, cancel = null;
    	TextView code = null, result = null;
    	EditText numCompte = null;
    	Random rand = new Random();
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		code = (TextView) findViewById(R.id.codeTxtId);
    		numCompte = (EditText) findViewById(R.id.numId);
    		valid = (Button) findViewById (R.id.validBut);
    		valid.setOnClickListener(this);
    		cancel.setOnClickListener(this);
    		result = (TextView) findViewById (R.id.resultTxtId);
    		result.setOnClickListener(this);
     
    		init();
    	}
    	void init()
    	{
    		int num1=0, num2=0;
     
    		// init de tous les bouttons
    		button[0][0]= (Button) findViewById(R.id.but00);
    		button[0][1]= (Button) findViewById(R.id.but01);
    		button[0][2]= (Button) findViewById(R.id.but02);
    		button[0][3]= (Button) findViewById(R.id.but03);
    		button[0][4]= (Button) findViewById(R.id.but04);
    		button[1][0]= (Button) findViewById(R.id.but10);
    		button[1][1]= (Button) findViewById(R.id.but11);
    		button[1][2]= (Button) findViewById(R.id.but12);
    		button[1][3]= (Button) findViewById(R.id.but13);
    		button[1][4]= (Button) findViewById(R.id.but14);
    		button[2][0]= (Button) findViewById(R.id.but20);
    		button[2][1]= (Button) findViewById(R.id.but21);
    		button[2][2]= (Button) findViewById(R.id.but22);
    		button[2][3]= (Button) findViewById(R.id.but23);
    		button[2][4]= (Button) findViewById(R.id.but24);
    		button[3][0]= (Button) findViewById(R.id.but30);
    		button[3][1]= (Button) findViewById(R.id.but31);
    		button[3][2]= (Button) findViewById(R.id.but32);
    		button[3][3]= (Button) findViewById(R.id.but33);
    		button[3][4]= (Button) findViewById(R.id.but34);
    		button[4][0]= (Button) findViewById(R.id.but40);
    		button[4][1]= (Button) findViewById(R.id.but41);
    		button[4][2]= (Button) findViewById(R.id.but42);
    		button[4][3]= (Button) findViewById(R.id.but43);
    		button[4][4]= (Button) findViewById(R.id.but44);
     
    		//remplissage aléatoire
    		for(int i=0 ; i<10 ; i++)
    		{
    			num1=rand.nextInt(5);
    			num2=rand.nextInt(5);
    			if (button[num1][num2].getText().equals(""))
    				button[num1][num2].setText(String.valueOf(i));
    			else
    				i--;
    		}				
    	}
    	@Override
    	public void onClick (View v) {
    		int ok=0;
    		if ((v==valid) && (numCompte.getText().equals(numBonCompte)) && (codeEcrit.equals(bonCode)))
    		{
    			result.setText("Paiement accepté");
    		}
    		else if (v==valid)
    		{
    			result.setText("Paiement refusé");
    		}
    		else
    			for (int i=0 ; i<5 ; i++)
    			{
    				for(int j=0 ; j<5 ; j++)
    				{
    					if (v==button[i][j])
    					{
    						codeEcrit = codeEcrit.toString().concat(button[i][j].getText().toString());
    						code.setText(code.getText().toString().concat("*"));
    						ok=1;
    						break;
    					}
    				}
    				if (ok==1)
    					break;
    			}
    	}
    }

  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
    Si l'application se ferme... il y a dans le logcat la raison (une exception) et toute les lignes qui l'ont engendrée (la stacktrace), la copier ici serait bien....

    Pour le "shuffling" des boutons j'ai pas trop compris l'algorithme qui me semble bien tordu pour juste "mélanger" des boutons.... mais bon... gardons cet algo

    La disposition en grille de 5x5 est purement cosmétique (on pourrait l'avoir en 1x10 ou en 3x3 + 1, cela ne changerait bien sur pas l'algorithme). Donc elle ne dépend que du "layout" de l'interface, et en rien du programme qui lui sait juste qu'il y a 25 boutons.

    Par exemple:
    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
     
     
    private final static int  NUM_BUTTONS = 25;
    private final static String PREFIX_ID_BUTTONS = "btn";
     
    private void init()
    {
        Button[]  buttons = new Button[NUM_BUTTONS];
        int[]  buttonValues  = new int[NUM_BUTTONS;
     
        // setup des buttons-id & values 
        for (int i = 0; (i < NUM_BUTTONS); ++i) {
           // ceci est un "trick" utilisant la reflectivité de Java pour aller chopper la valeur de R.id.btnXXX
           try {
               String idname = PREFIX_ID_BUTTONS +Integer.toString(i+1);
               int id = R.id.class.getField(idname).getInt(null);
               buttons[i] = (Button) findViewById(id);
               buttonsValues[i] = -1;
               buttons[i].setOnClickListener(this);
           } catch (Exception ex) {
               Log.w("Shuffling","Impossible de trouver le bouton #"+i,ex);
           }
        }
     
        // insertion aléatoire des 10 valeurs...
        for (int i = 0; (i < 10); ++i) {
            // il vaut mieux ne pas jouer avec l'indice de la boucle et utiliser une autre boucle interne pour plus de clareté.
            boolean found = false;
            while (!found) {
                int randpos = rand.nextInt(NUM_BUTTONS);
                if (buttonsValue[randpos] == -1) {
                    found = true;
                    buttonsValue[randpos] = i;
                }
            }
        }
     
        // assignation des textes
        for (int i = 0; (i < 25); ++i) {
            buttons[i].setText( 
                 (buttonsValues[j] < 0) ? 
                          "" : 
                          Integer.toString(buttonsValues[j]) 
            );
        }
    }
    Ensuite dans le "onClick"... nul besoin de faire toute la tringlerie...
    Et au passage... utiliser un StringBuilder pour "codeEcrit"....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       } else {
           String str = view.getText().toString();
           if (str.length() == 1) {
               try {
                   int v = Integer.valueOf(str);
                   codeEcrit.append(str);
                   code.setText(code.getText().toString().concat("*"));
               } catch (NumberFormatException nfe) {
                  // pas sur un 'chiffre' ?
               }
           }
       }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup de votre réponse !

    Et bien oui, c'est très possible que ma manière de faire soit un peu tordue, étant donné que je débute en programmation !

    Je vous joint ce que m'affiche le logcat :



    Il est vrai que votre code me paraît plus simple, même s'il contient plusieurs choses que je n'avais jamais vues !
    Je vais le regarder de plus près ! .

    Je vous remercie sincèrement de votre réponse, si vous en avez le temps et trouvez la solution à mon problème à partir de mon algorithme, ce serait plus que parfait.
    Dans le cas contraire je comprendrais parfaitement .

  4. #4
    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
    Alors ctrl+c , ctrl+v entre deux balises "code" aurait été plus pratique qu'une copie d'écran mais c'est pas grave il y a tout...

    java.lang.RuntimeException: Unable to start activity com.example.bancaire.MainActivity
    Le système n'a pu démarré l'activité "MainActivity"
    Caused by: java.lang.NullPointerException
    A cause d'une exception "NPE" (utilisation d'un objet non initialisé)
    at com.example.bancaire.MainActivity.onCreate(MainActivity.java:31)
    Qui a eu lieu ligne 31 du fichier MainActivity.java, dans la fonction "onCreate" de com.example.bancaire.MainActivity

    Cela doit correspondre à la ligne 30 du code pasté dans le premier message à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cancel.setOnClickListener(this);
    Comme "cancel" n'est jamais initialisé avant.... cancel est null.... cancel.setOnClickListener va donc lancer une NPE.



    En fait quand je disais que c'était "tordu" c'était dans le sens ou il peut y avoir un risque... par exemple 10 boutons seulement et que le "random" par malchance persiste à ne jamais sortir le dernier bouton vide... Le comportement (le coût de l'algo donc) est dépendant du random, et donc aléatoire...
    L'idée, est de prendre 25 boutons, et de les "mélanger".... donc un vrai algo de ce type serait à "cout fixe"... Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ArrayList<Integer> values = new ArrayList<Integer>();
    for (int i = 0; (i < NUM_BUTTONS); ++i) {
        int index = random.nextInt(i+1);
        Integer value = Integer.valueOf(i<10 ? i : -1);
        values.insert(value,index);
    }

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, je vais tester tout ça !

  6. #6
    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
    Ha au fait... au passage....

    La fonction "random" n'est bien entendu pas vraiment aléatoire surtout sur une machine a états finis comme un ordinateur... (il existe des moyens d'avoir quelque chose de vraiment aléatoire sur un ordinateur, mais cela nécessite des outils hardware bien trop chers pour notre cas ici).

    Donc... revenons à Random:
    The class uses a 48-bit seed, which is modified using a linear congruential formula.
    C'est donc à partir d'une seed, une fonction LINEAIRE, dont la seule garantie est de produire une distribution uniforme sur 32 bits.... (et encore, certaines "seed" peuvent ne pas fonctionner comme attendu).

    Par contre, rien ne dit que le passage en 2D (deux appels à random pour générer un (x,y) ) produise une répartition UNIFORME sur le plan !!!
    Et donc le cas de ne jamais tomber sur une "case" particulière est fortement probable !

    Il est possible de limiter (mais pas de s'assurer) le cas, en utilisant deux générateurs distincts.

    Donc raison de plus pour conserver des tableaux à 1 seule dimension, et laisser l'interface s'occuper de les placer dans un plan.

Discussions similaires

  1. [Débutant] Problème pour écrire dans un bouton
    Par Paulinho dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/01/2006, 11h45
  2. problème de placement avec IE
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2005, 23h46
  3. [IE]problème erreur
    Par kevinf dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/11/2005, 21h48
  4. Différence date .. problème #Erreur
    Par priest69 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 15h04
  5. Placement aléatoire
    Par Steph82 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/09/2003, 12h07

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