android ecouteur - Est-il possible d'écrire une boucle for pour assigner des écouteurs à plusieurs boutons avec la même fonction que celle utilisée pour les finales?




2 Answers

Oui, vous ne pouvez pas accéder à la variable dans vos classes internes si elle n'est pas déclarée comme finale. Une solution de contournement simple consiste à créer la classe wrapper OnClickListener.

private class MyListener implements Button.OnClickListener {
    int pos;
    public MyListener (int position) {
        pos = position;
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent getContactIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
        startActivityForResult(getContactIntent, pos);
    }
}

puis utilisez-le dans votre code comme celui-ci

//for loop to assign same functionality to buttons in pickPlayers array
for(int i = 0; i<pickPlayers.length; i++){
    b = (Button) findViewById(pickPlayers[i]);
    b.setOnClickListener(new MyListener(i));
}

Aussi, si vos boutons sont dans un ViewGroup, vous pouvez utiliser getChildAt et getChildCount pour les itérer

ViewGroup parent;
// initialize the parent
int l = parent.getChildCount();
for (int i = 0 ; i < l ; i++) {
    Button button = parent.getChildAt(i);
}
samsung comment

J'écris une application Android et j'ai 8 boutons sur une vue qui ont tous la même fonction, donc je voulais attribuer la même fonctionnalité à chaque bouton en utilisant une boucle for plutôt que d'écrire 8 morceaux de code séparé. Cependant, un problème survient lorsque je veux utiliser le compteur de la boucle for dans la fonction onClick pour aider à déclencher une intention, voici le code:

//array of button ids
public int [] pickPlayers = { R.id.pick_player_1a, R.id.pick_player_2a, R.id.pick_player_3a, R.id.pick_player_4a, R.id.pick_player_1b, R.id.pick_player_2b, R.id.pick_player_3b, R.id.pick_player_4b};

//button to be used in for loop
public Button b;

//for loop to assign same functionality to buttons in pickPlayers array
for(int i = 0; i<pickPlayers.length; i++){
        b = (Button) findViewById(pickPlayers[i]);
        b.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent getContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(getContactIntent, i);
            }
        });
    };

J'espère que tout a du sens, merci à tous ceux qui peuvent aider. :)

EDIT: C'est l'erreur que je reçois: Impossible de se référer à une variable non-finale i dans une classe interne définie dans une méthode différente

La boucle for est dans ma méthode oncreate les variables et les boutons sont à l'extérieur




Si ces boutons sont décalés dans XMl, vous devriez peut-être configurer android: onClick listener à travers XML?

Vous devez définir une méthode dans votre activité:

public void myHandler(View v) {
    // Your stuff...
}

Et ajouter

android:onClick="myHandler" 

à tous?

Merci.




Related

android button for-loop android-intent onclick