Spinner Android: Obtenez l'événement de changement d'élément sélectionné

comment définir l'écouteur d'événements 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
}
330
demandé sur Genia S. 2009-08-27 00:53:46

14 réponses

certaines des réponses précédentes ne sont pas correctes. Ils travaillent pour d'autres widgets et vues, mais la documentation pour le widget Spinner indique clairement:

un spinner ne supporte pas l'élément clic événement. Appeler cette méthode soulèvera exception.

Meilleure utilisation OnItemSelectedListener() au lieu de:

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
    }

});

ça me va.

notez que la méthode onItemSelected est également invoquée lorsque la vue est en cours de construction, vous pouvez donc envisager de la mettre dans l'appel de méthode onCreate() .

707
répondu znq 2012-08-09 22:10:23
Spinner 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: souvenez-vous d'une chose.

Spinner OnItemSelectedListener événement va exécuter deux fois:

  1. Spinner " initialisation
  2. Sélection manuelle par L'utilisateur

essayez de les différencier en utilisant la variable flag.

46
répondu Santhosh 2016-11-23 05:25:13

vous pouvez implémenter la classe AdapterView.OnItemSelectedListener dans votre activité.

et ensuite utiliser la ligne ci-dessous à l'intérieur de onCreate()

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

remplace alors 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("");
}
14
répondu Dhasneem 2013-07-15 14:12:20

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

vous pouvez éviter que L'Onitemseltedlistener() soit appelé avec un simple check: 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.

e. g:

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!

10
répondu Sampath 2017-05-23 10:31:35

le docs pour le widget spinner dit:" un spinner ne supporte pas les évènements de clic d'item." Vous devez utiliser "setOnItemSelectedListener" pour traiter votre problème

5
répondu johndotnet 2012-05-04 11:42:33
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);
4
répondu Chiwai Chan 2009-09-10 17:34:28

Trouvez votre nom de spinner et trouvez id puis implémentez cette méthode.

spinnername.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
    }
});
4
répondu ravi vachhani 2013-07-15 14:21:21

prendre une variable globale pour la sélection actuelle de spinner:

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"  
android:textColor="@color/black"         
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape android:shape="rectangle">
    <solid android:color="#e2e3d7" />
   </shape>
 </item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
    <solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>
3
répondu indrajeet 2016-07-27 04:34:56

cela n'a pas d'importance que vous mettiez OnItemSelectedListener dans onCreate ou onStart - il sera encore appelé pendant la création D'activité ou le démarrage (respectivement).

Donc nous pouvons le mettre dans onCreate (et pas dans onStart!).

Il suffit d'ajouter un drapeau pour comprendre la première initialisation:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

puis dans onCreate (ou onCreateView):

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });
2
répondu Leo Droidcoder 2016-08-23 13:02:19

si vous voulez un vrai onChangedListener(). Stockez la valeur initiale dans le gestionnaire et vérifiez si elle a changé. Il est simple et ne pas nécessitent une variable globale. Si vous avez plus d'un compteur sur la page.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

les Objets sont vos amis, utilisez-les.

2
répondu fishjd 2016-11-25 15:17:02
spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );
1
répondu kaub0st3r 2013-11-11 16:07:53

Brillant au-dessus de Stefan Klumpp aussi m'a beaucoup aidé. Remercier. Je suis un newbie et le "@Override"dans il a provoqué une erreur à propos de "doit remplacer une Super méthode de la classe du même nom". Eclipse a suggéré que je devrais supprimer les dérogations. Quand j'ai fait cela, il a travaillé. S'il vous plaît ne me demandez pas comment ni pourquoi.

0
répondu 2009-12-31 14:37:45

la meilleure façon, à mon avis, serait d'avoir un flagitemselected=0; in oncreate. Et sur l'élément sélectionné l'incrément d'événement que le drapeau I. e flagitemselected++; puis vérifiez si (flagitemselected!=1) {//Faites votre travail ici}.Cela aidera I guess

0
répondu Pinakin 2012-03-16 07:50:43

un truc que j'ai trouvé était de mettre vos listeners selected de setonitem dans onWindowFocusChanged au lieu d'onCreate. Je n'ai pas trouvé de mauvais effets secondaires à le faire de cette façon, encore. Fondamentalement, configurer les auditeurs après la fenêtre pénètre. Je ne sais pas combien de fois onWindowFocusChanged court, mais il est assez facile de créer vous-même une variable de verrouillage Si vous la trouvez en cours d'exécution trop souvent.

je pense que Android pourrait utiliser un système de traitement basé sur les messages, et si vous mettez tout dans onCreate, vous pouvez courir dans des situations où le spinner est peuplé après qu'il soit dessiné. Ainsi, votre interlocuteur se déclencher après avoir défini l'emplacement de l'élément. C'est une supposition, bien sûr, mais n'hésitez pas à me corriger sur ce point.

-1
répondu Joe Plante 2012-08-10 18:48:40