2009-10-31 8 views
4

Le onClick ne tire jamais! Pourquoi pas? Aidez-moi, s'il vous plaît.Android dynamiquement créé Bouton: setOnClickListener ne fonctionne pas

for(int i = 0; i < 12; i++) { 
    String title = "Button" + i; 
    Button sliderButton = new Button(this); 
    sliderButton.setText(title); 
    glideMenuTray.addView(sliderButton,100,40); 

    sliderButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.d("gm", "Tapped "); 
     } 
    }); 
} 
+0

Je doute qu'il fera aucune différence, mais avez-vous essayé d'ajouter le '' OnClickListener' avant d'appeler glideMenuTray.addView() '? –

Répondre

0

Si vous utilisez Donut ou Eclair, vous pouvez utiliser écouteur de clics commun, enregistré dans votre activité et accroché avec vos boutons dans le fichier XML de mise en page.

Pour référence, regardez here, la catégorie plus facile cliquez sur auditeurs.

+0

Je ne pense pas que cette méthode pour les auditeurs de click plus facile fonctionnera, puisque ses boutons sont dynamiques, pas prédéfinis en XML. – Konklone

2

Je ne suis pas un expert en la matière, mais c'est probablement quelque chose à voir avec la récupération de place et la sortie de OnClickListeners. Bien que je ne pense pas que vous puissiez utiliser l'approche super facile à onClickListeners que Dimitar mentionne, vous pouvez probablement utiliser l'approche du milieu que la section qu'il lie à discuter, même si ce n'est pas une nouvelle approche. Pour répéter l'exemple de code ici, il est:

View.OnClickListener handler = View.OnClickListener() { 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.myButton: // doStuff 
       break; 
      case R.id.myOtherButton: // doStuff 
       break; 
     } 
    } 
} 

findViewById(R.id.myButton).setOnClickListener(handler); 
findViewById(R.id.myOtherButton).setOnClickListener(handler); 

Si la seule chose distinguer les boutons est leur texte du titre, eh bien, vous pouvez l'utiliser pour les distinguer dans la méthode maître onClick.

+0

Les objets ne sont pas collectés à moins qu'ils ne soient accessibles via une racine gc. Le code de l'OP crée des boutons qui sont ajoutés à glideMenuTray qui est probablement référencé par quelque chose (par exemple une activité) qui est accessible à partir d'une racine gc et par conséquent l'argument de garbage collection n'a aucun sens. – gardarh

2

De plus, pas shure, j'ai eu un problème comme ça sur un TextView et c'était parce que je na pas ajouter setClickable(true)

Mon code était quelque chose comme

TextView text = new TextView(this); 
text.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
text.setText("***"); 
text.setClickable(true); 

text.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     //My action 
    } 
}); 

myViewGroup.addView(text); 

Hope this helps

0

Ai-je raison de supposer que la ligne suivante:

glideMenuTray.addView(sliderButton,100,40); 

Ajouter s la vue des coords x: 100, y: 40 sur une vue étendue ViewGroup?

Dans ce cas, vous empilez 12 boutons l'un sur l'autre, seul le dernier bouton (appelé Button11) sera visible (et cliquable).

Et à condition que la question est de 3 ans, je l'espère vraiment que vous avez déjà résolu ce maintenant :)

0

définir la setOnClickListener avant d'ajouter la vue.

for(int i = 0; i < 12; i++) { 
    String title = "Button" + i; 
    Button sliderButton = new Button(this); 
    sliderButton.setText(title); 
    sliderButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.d("gm", "Tapped "); 
     } 
    glideMenuTray.addView(sliderButton,100,40); 
} 
Questions connexes