438 votes

Android Spinner: Récupère l'événement de modification d'élément sélectionné

Comment pouvez-vous définir l'écouteur d'événement pour un Spinner lorsque l'élément sélectionné change?

Fondamentalement, ce que j'essaie de faire est quelque chose de similaire à ceci:

 spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
 

882voto

znq Points 13027

Certaines réponses ne sont pas correctes. Ils travaillent pour d'autres widgets et des points de vue, mais la documentation pour le Spinner widget indique clairement:

Un spinner ne supporte pas l'élément, cliquez sur les événements. L'appel de cette méthode va augmenter une exception.

Mieux utiliser OnItemSelectedListener() à la place:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

Cela fonctionne pour moi.

Notez que onItemSelected méthode est également appelée lorsque l'affichage est en cours, alors vous pouvez envisager de le mettre à l'intérieur d' onCreate() appel de la méthode.

60voto

Santhosh Points 242
 Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 
 

Note: Rappelez-vous une chose .... L'événement Spinner OnclickListener s'exécutera deux fois 1. Initialisation de Spinner 2. Utilisateur sélectionné manuellement

Essayez de différencier ces deux en utilisant flag varable

24voto

Dhasneem Points 788

Vous pouvez implémenter AdapterView.OnItemSelectedListener class dans votre Activity.

Et puis utilisez la ligne ci-dessous dans onCreate()

 Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
 

Puis remplacez ces deux méthodes:

 public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}
 

20voto

Isuru Sampath Points 92

http://stackoverflow.com/q/1714426/811625

Vous pouvez éviter que OnItemSelectedListener () soit appelé avec une simple vérification: Stockez l'index de sélection actuel dans une variable entière et vérifiez dans l'onItemSelected (..) avant de faire quoi que ce soit.

Par exemple:

 Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 
 

De cause le iCurrentSelection devrait être dans la portée de l'objet pour que cela fonctionne!

8voto

johndotnet Points 78

La documentation du widget spinner indique: "Un spinner ne prend pas en charge les événements de clic sur un élément." Vous devriez utiliser "setOnItemSelectedListener" pour gérer votre problème

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X