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 :

Simplifier les Event listener


Sujet :

Android

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut Simplifier les Event listener
    Salut à tous,

    Je débute avec android et enchaine donc les tutos. Je me suis donc atteler à une simple calculatrice.

    Je suis étonnament surpris par la lourdeur de la gestion des événements , du coup je me dis que j'ai peut être raté quelques subtilité.

    Voici ce que je fait :

    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
    public void onClick(View v)
    {
    	switch(v.getId())
    	{
    		case R.id.button0 : 
    		case R.id.button1 :
    		case R.id.button2 :
    		case R.id.button3 :
    		case R.id.button4 :
    		case R.id.button5 :
    		case R.id.button6 :
    		case R.id.button7 :
    		case R.id.button8 :
    		case R.id.button9 :
    		{
    			String value 	= ((Button)v).getText().toString();
    			if(update)
    				update = false;
    			else
    				value = ecran.getText() + value;
     
    			ecran.setText(value);
    		}
    	}
    }
     
    public void onCreate(Bundle savedInstanceState) 
    {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.main);
     
    	ecran = (EditText) findViewById(R.id.editResult);
    	findViewById(R.id.button0).setOnClickListener(this);
    	findViewById(R.id.button1).setOnClickListener(this);
    	findViewById(R.id.button2).setOnClickListener(this);
    	findViewById(R.id.button3).setOnClickListener(this);
    	findViewById(R.id.button4).setOnClickListener(this);
    	findViewById(R.id.button5).setOnClickListener(this);
    	findViewById(R.id.button6).setOnClickListener(this);
    	findViewById(R.id.button7).setOnClickListener(this);
    	findViewById(R.id.button8).setOnClickListener(this);
    	findViewById(R.id.button9).setOnClickListener(this);
    }
    C'est surtout la partie dans le onCreate qui me chagrine un peu. Si j'ai 200 boutons , je vais avoir une tartines de code complètement imbuvable juste pour m'attacher à ma méthode gérant le onclick.

    N'y a t'il pas plus simple ?
    (je précise que mon expérience JAVA se limite à du non graphique , donc patapé si je fait des erreurs grossières )
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Ton code pourrait être "simplifier" comme ça :
    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
     
     
    public OnClickListener btClickListener = new OnClickListener() {
      public void onClick(View v) {
        String value 	= ((Button)v).getText().toString();
        if(update) {
          update = false;
        } else {
          value = ecran.getText() + value;
        }
     
        ecran.setText(value);	
      }
    }
     
     
    public void onCreate(Bundle savedInstanceState) 
    {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.main);
     
    	ecran = (EditText) findViewById(R.id.editResult);
    	findViewById(R.id.button0).setOnClickListener(btClickListener);
    	findViewById(R.id.button1).setOnClickListener(btClickListener);
    	findViewById(R.id.button2).setOnClickListener(btClickListener);
    	findViewById(R.id.button3).setOnClickListener(btClickListener);
    	findViewById(R.id.button4).setOnClickListener(btClickListener);
    	findViewById(R.id.button5).setOnClickListener(btClickListener);
    	findViewById(R.id.button6).setOnClickListener(btClickListener);
    	findViewById(R.id.button7).setOnClickListener(btClickListener);
    	findViewById(R.id.button8).setOnClickListener(btClickListener);
    	findViewById(R.id.button9).setOnClickListener(btClickListener);
    }
    Après je suis d'accord que la gestion évènementielle "à la Swing" est un peu lourde par moment...


    Si j'ai 200 boutons , je vais avoir une tartines de code complètement imbuvable juste pour m'attacher à ma méthode gérant le onclick.
    Je partirais plutôt dans la raisonnement inverse :
    Est-ce normal d'avoir plus de 200 boutons sur un même interface ?
    Après il y a certaines techniques d'optimisation qui te feront gagner des lignes de code, mais il faut que le code soit bien fait, et soit suffisamment générique.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Pourquoi est ce mieux de passer une instance de OnClickListener plutôt que mon objet courant qui de toute manière implémente OnClickListener ?

    Je partirais plutôt dans la raisonnement inverse :
    Est-ce normal d'avoir plus de 200 boutons sur un même interface ?
    On est d'accord , la calculette me semble déjà être un exemple costaud niveau nombre de bouton mais c'était pour l'exemple
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Il me semble qu'il y avait déjà eu une discussion sur ce sujet , et la solution donnée pour éviter cette surcharge dans le OnCreate était de l'implémenter directement dans le xml

    http://developer.android.com/referen...ndroid:onClick

    android:onClick
    Since: API Level

    Name of the method in this View's context to invoke when the view is clicked. This name must correspond to a public method that takes exactly one parameter of type View. For instance, if you specify android:onClick="sayHello", you must declare a public void sayHello(View v) method of your context (typically, your Activity).

    Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character.

    This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

    This corresponds to the global attribute resource symbol onClick.
    Related Methods
    Après c'est la même charge de code sauf que tu n'auras pas la masse de déclaration dans le onCreate .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. Mettre une methode dans un event listener
    Par FidoDido® dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/07/2006, 21h23
  2. [Forms-PJC]Les events en dehors de mon wrapper
    Par patmaba dans le forum Forms
    Réponses: 13
    Dernier message: 16/06/2006, 12h05
  3. Capturer les event de ma souris en dehors de mon appl
    Par bpy1401 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 28/07/2005, 16h59
  4. les event de IBQuery pour activer,desactiver la Transaction?
    Par amad206 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 14h12
  5. Gérer les events d'un tableau de boutons
    Par lord_kalipsy dans le forum wxWidgets
    Réponses: 7
    Dernier message: 20/10/2004, 10h13

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