Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Beaucoup boutons, un setOnClickListener

Possibilité de simplifier ?

Sujet résolu
    11 mai 2013 à 11:52:58

    Bonjour à vous amis Zéros :)

    Je commence doucement le développement sous Android et je suis en train de faire une petite application pour mon projet de fin d'année. En page d'accueil, j'ai une grosse quantité de ButtonView qui ont tous la même méthode clickListener vu que dedans je fais un switch(v.getId()).

    Je voudrais donc savoir si il y existe une manière de limiter le code avec une boucle ou autre chose ? Voici le code (normal ou horrible je sais pas.. :honte:) :

    public class MainActivity extends Activity {
    
    	Button button_inter_prod_2tel = null;
    	Button button_inter_prod_2dsl = null;
    	Button button_inter_prod_2deg = null;
    	Button button_inter_prod_2dgt = null;
    	Button button_inter_prod_3tel = null;
    	Button button_inter_prod_3dsl = null;
    	Button button_inter_prod_3deg = null;
    	Button button_inter_prod_3dgt = null;
    	Button button_inter_prod_10tel = null;
    	Button button_inter_prod_10dsl = null;
    	Button button_inter_prod_10dgt = null;
    	Button button_inter_prod_10nub = null;
    	Button button_inter_rep_tel = null;;
    	Button button_inter_rep_anu = null;
    	Button button_inter_rep_deg = null;
    	Button button_inter_rep_dgt = null;
    	Button button_inter_ligne_tel = null;
    	Button button_inter_ligne_dsl = null;
    	Button button_inter_ligne_dgt = null;
    	Button button_inter_ligne_anu = null;
    	Button button_inter_branc_tel = null;
    	Button button_inter_branc_dsl = null;
    	Button button_inter_branc_dgt = null;
    	Button button_inter_pms = null;
    	Button button_inter_experB_dgt = null;
    	Button button_inter_experB_deg = null;
    	Button button_inter_experC_dgt = null;
    	Button button_inter_experC_deg = null;
    	Button button_inter_experC_anu = null;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		button_inter_prod_2tel = (Button) findViewById(R.id.inter_prod_2tel);
    		button_inter_prod_2dsl = (Button) findViewById(R.id.inter_prod_2dsl);
    		button_inter_prod_2deg = (Button) findViewById(R.id.inter_prod_2deg);
    		button_inter_prod_2dgt = (Button) findViewById(R.id.inter_prod_2dgt);
    		button_inter_prod_3tel = (Button) findViewById(R.id.inter_prod_3tel);
    		button_inter_prod_3dsl = (Button) findViewById(R.id.inter_prod_3dsl);
    		button_inter_prod_3deg = (Button) findViewById(R.id.inter_prod_3deg);
    		button_inter_prod_3dgt = (Button) findViewById(R.id.inter_prod_3dgt);
    		button_inter_prod_10tel = (Button) findViewById(R.id.inter_prod_10tel);
    		button_inter_prod_10dsl = (Button) findViewById(R.id.inter_prod_10dsl);
    		button_inter_prod_10dgt = (Button) findViewById(R.id.inter_prod_10dgt);
    		button_inter_prod_10nub = (Button) findViewById(R.id.inter_prod_10nub);
    		button_inter_rep_tel = (Button) findViewById(R.id.inter_rep_tel);
    		button_inter_rep_anu = (Button) findViewById(R.id.inter_rep_anu);
    		button_inter_rep_deg = (Button) findViewById(R.id.inter_rep_deg);
    		button_inter_rep_dgt = (Button) findViewById(R.id.inter_rep_dgt);
    		button_inter_ligne_tel = (Button) findViewById(R.id.inter_ligne_tel);
    		button_inter_ligne_dsl = (Button) findViewById(R.id.inter_ligne_dsl);
    		button_inter_ligne_dgt = (Button) findViewById(R.id.inter_ligne_dgt);
    		button_inter_ligne_anu = (Button) findViewById(R.id.inter_ligne_anu);
    		button_inter_branc_tel = (Button) findViewById(R.id.inter_branc_tel);
    		button_inter_branc_dsl = (Button) findViewById(R.id.inter_branc_dsl);
    		button_inter_branc_dgt = (Button) findViewById(R.id.inter_branc_dgt);
    		button_inter_pms = (Button) findViewById(R.id.inter_pms);
    		button_inter_experB_dgt = (Button) findViewById(R.id.inter_experB_dgt);
    		button_inter_experB_deg = (Button) findViewById(R.id.inter_experB_deg);
    		button_inter_experC_dgt = (Button) findViewById(R.id.inter_experC_dgt);
    		button_inter_experC_deg = (Button) findViewById(R.id.inter_experC_deg);
    		button_inter_experC_anu = (Button) findViewById(R.id.inter_experC_anu);
    	
    		button_inter_prod_2tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_2dsl.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_2deg.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_2dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_3tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_3dsl.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_3deg.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_3dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_10tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_10dsl.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_10dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_prod_10nub.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_rep_tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_rep_anu.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_rep_deg.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_rep_dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_ligne_tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_ligne_dsl.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_ligne_dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_ligne_anu.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_branc_tel.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_branc_dsl.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_branc_dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_pms.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_experB_dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_experB_deg.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_experC_dgt.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_experC_deg.setOnClickListener(clickListenerBoutons_Proc);
    		button_inter_experC_anu.setOnClickListener(clickListenerBoutons_Proc);
    	}
    
    	private OnClickListener clickListenerBoutons_Proc = new View.OnClickListener() {
    		
    		@Override
    		public void onClick(View v) {
    			Intent intent = null;
    			switch(v.getId()) {
    				case R.id.inter_prod_2tel:
    					intent = new Intent(MainActivity.this, ProcActivity.class);
    				break;
    				case R.id.inter_prod_2dsl:
    					intent = new Intent(MainActivity.this, Proc_R02dsl_Activity.class);
    				break;
    				case R.id.inter_prod_2deg:
    					intent = new Intent(MainActivity.this, Proc_R02deg_Activity.class);
    				break;
    				case R.id.inter_prod_2dgt:
    					intent = new Intent(MainActivity.this, Proc_R02dgt_Activity.class);
    				break;
    				case R.id.inter_prod_3tel:
    					intent = new Intent(MainActivity.this, Proc_R03tel_Activity.class);
    				break;
    				case R.id.inter_prod_3dsl:
    					intent = new Intent(MainActivity.this, Proc_R03dsl_Activity.class);
    				break;
    				case R.id.inter_prod_3deg:
    					intent = new Intent(MainActivity.this, Proc_R03deg_Activity.class);
    				break;
    				case R.id.inter_prod_3dgt:
    					intent = new Intent(MainActivity.this, Proc_R03dgt_Activity.class);
    				break;
    				case R.id.inter_prod_10tel:
    					intent = new Intent(MainActivity.this, Proc_R10tel_Activity.class);
    				break;
    				case R.id.inter_prod_10dsl:
    					intent = new Intent(MainActivity.this, Proc_R10dsl_Activity.class);
    				break;
    				case R.id.inter_prod_10dgt:
    					intent = new Intent(MainActivity.this, Proc_R10dgt_Activity.class);
    				break;
    				case R.id.inter_prod_10nub:
    					intent = new Intent(MainActivity.this, Proc_R10nub_Activity.class);
    				break;
    				case R.id.inter_rep_tel:
    					intent = new Intent(MainActivity.this, Proc_PREtel_Activity.class);
    				break;
    				case R.id.inter_rep_anu:
    					intent = new Intent(MainActivity.this, Proc_PREanu_Activity.class);
    				break;
    				case R.id.inter_rep_deg:
    					intent = new Intent(MainActivity.this, Proc_PREdeg_Activity.class);
    				break;
    				case R.id.inter_rep_dgt:
    					intent = new Intent(MainActivity.this, Proc_PREdgt_Activity.class);
    				break;
    				case R.id.inter_ligne_tel:
    					intent = new Intent(MainActivity.this, Proc_PLItel_Activity.class);
    				break;
    				case R.id.inter_ligne_dsl:
    					intent = new Intent(MainActivity.this, Proc_PLIdsl_Activity.class);
    				break;
    				case R.id.inter_ligne_dgt:
    					intent = new Intent(MainActivity.this, Proc_PLIdgt_Activity.class);
    				break;
    				case R.id.inter_ligne_anu:
    					intent = new Intent(MainActivity.this, Proc_PLIanu_Activity.class);
    				break;
    				case R.id.inter_branc_tel:
    					intent = new Intent(MainActivity.this, Proc_PITtel_Activity.class);
    				break;
    				case R.id.inter_branc_dsl:
    					intent = new Intent(MainActivity.this, Proc_PITdsl_Activity.class);
    				break;
    				case R.id.inter_branc_dgt:
    					intent = new Intent(MainActivity.this, Proc_PITdgt_Activity.class);
    				break;
    				case R.id.inter_pms:
    					intent = new Intent(MainActivity.this, Proc_PMS_Activity.class);
    				break;
    				case R.id.inter_experB_dgt:
    					intent = new Intent(MainActivity.this, Proc_EXBdgt_Activity.class);
    				break;
    				case R.id.inter_experB_deg:
    					intent = new Intent(MainActivity.this, Proc_EXBdeg_Activity.class);
    				break;
    				case R.id.inter_experC_dgt:
    					intent = new Intent(MainActivity.this, Proc_EXCdgt_Activity.class);
    				break;
    				case R.id.inter_experC_deg:
    					intent = new Intent(MainActivity.this, Proc_EXCdeg_Activity.class);
    				break;
    				case R.id.inter_experC_anu:
    					intent = new Intent(MainActivity.this, Proc_EXCanu_Activity.class);
    				break;
    			}
    			startActivity(intent);
    		}
    	};
    }


    Je vous remercie d'avance. 

    Cordialement Morg@n
    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2013 à 12:27:50

      Bonjour,

      Moi ce que je fais pour réduire le code, c'est d'implémenter l'interface onClickListener. Tu vas récupérer la méthode onClick(View v). Ensuite tu déclares le onClickListener directement dans le fichier XML de ta vue. En gros dans chacun de tes Button, tu ajoutes le nom de la méthode du listener que tu viens de créer : 

      <Button 
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="onClick"
      />


      Avec ça tu peux supprimer les déclarations  des Button, les findViewById() et les setOnClickListener(). Pour le switch, je vois pas comment raccourcir ça pour le moment.



      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2013 à 13:09:36

        Merci beaucoup, je ne connaissais pas cette solution et elle a vraiment simplifié énormément mon code ! :)

        -
        Edité par Morg@n 11 mai 2013 à 13:09:52

        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2013 à 13:37:18

          De rien, on est tous passé par là au début. :) Je te met ce lien aussi : http://developer.android.com/guide/topics/ui/controls/button.html c'est bien mieux expliqué que moi mais en Anglais. N'hésite pas à voir le site en entier aussi qui est très bien fait.
          • Partager sur Facebook
          • Partager sur Twitter
            11 mai 2013 à 20:37:02

            Je vais toujours sur la doc mais il y a tellement de chose et c'est en Anglais qu'on ne voit pas toujours ce qu'on aimerait voir. :p 

            Donc pour mon problème, j'ai tout bêtement mis mon switch() dans une méthode publique et sur tous mes boutons j'ai mis le 

            <Button android:onClick="onClick" />

            :)

            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2013 à 14:57:21

              Je reviens à la charge pour savoir si tu as trouvé un moyen de modifié cette attributs dans le code JAVA ? J'ai regardé dans la doc, il n'existe pas de fonction du genre :

              bouton.setOnClick();

              Alors je voudrais savoir si tu as déjà été confronté à ce problème et comment tu l'as contourné ? :)
              • Partager sur Facebook
              • Partager sur Twitter
                12 mai 2013 à 19:22:49

                Je n'ai pas très bien compris ton problème. Tu veux faire quoi exactement? 

                Remet le code, ça sera plus simple :)

                • Partager sur Facebook
                • Partager sur Twitter
                  12 mai 2013 à 21:22:02

                  C'est un autre problème mais que j'aimerais résoudre avec ta solution. J'ai créé une base de donnée, et en fonction de X entrées dans une table, je veux créer X boutons et pour cela je fais : 

                  List<Interventions> interventionsList = interventionBdd.getAllInterventions();
                  for (Interventions inter : interventionsList) {
                  	Button bouton = new Button(getBaseContext());
                  	bouton.setWidth(LONGUEUR);
                  	bouton.setHeight(HAUTEUR);
                  	bouton.setText(inter.getType() + " - " + inter.getDate());
                  	monly.addView(textView);
                  }

                  et j'aimerais pouvoir y faire bouton.setOnClick(ma_methode) mais cela n'existe ou du moins, je n'ai pas trouvé.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mai 2013 à 22:41:31

                    C'est la méthode setOnClickListener et non setOnClick. Comme tu as fait dans ton premier post.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 mai 2013 à 15:44:49

                      Oui effectivement, depuis ces trois jours je suis à fond et là je vois la chose différente, merci beaucoup. :)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Android] Beaucoup boutons, un setOnClickListener

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown