web-dev-qa-db-fra.com

Android Spinner: Obtenir 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é est modifié?

Fondamentalement, ce que j'essaie de faire ressemble à ceci:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
345
Soni Ali

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

Un compteur ne prend pas en charge le clic sur l'élément événements. L'appel de cette méthode augmentera une exception.

Meilleure utilisation 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 la méthode onItemSelected est également appelée lors de la création de la vue. Vous pouvez donc envisager de la placer dans l'appel de la méthode onCreate()

732
znq
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: N'oubliez pas une chose. 

L'événement Spinner OnItemSelectedListener sera exécuté deux fois:

  1. Initialisation de la spinner 
  2. Utilisateur sélectionné manuellement

Essayez de différencier ces deux en utilisant la variable flag.

49
Santhosh

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

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

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

Puis substituez 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("");
}
15
Dhasneem

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

Vous pouvez éviter que OnItemSelectedListener () soit appelé par une simple vérification: enregistrez l'index de sélection actuel dans une variable entière et vérifiez-le dans 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;
    } 
}); 

Bien parce que la iCurrentSelection devrait être dans la portée de l'objet pour que cela fonctionne!

14
Sampath

La documentation du widget spinner indique: "Un spinner ne prend pas en charge les événements de clic d'élément."

6
johndotnet

Recherchez votre nom de spinner et recherchez son identificateur, 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
    }
});
5
droidster.me
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);
5
Chiwai Chan

Peu importe que vous définissiez OnItemSelectedListener dans onCreate ou onStart - il sera toujours appelé lors de la création ou du démarrage de Activity (respectivement).
Nous pouvons donc le définir dans onCreate (et non dans onStart!).
Il suffit d’ajouter un drapeau pour déterminer la première initialisation:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

puis dans onCreate (ou onCreateView), il suffit de:

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;
            }
        });
3
Leo Droidcoder

Si vous voulez un vrai onChangedListener (). Stockez la valeur initiale dans le gestionnaire et vérifiez si elle a changé. C'est simple et not ne nécessite pas une variable globale. Fonctionne si vous avez plus d'un spinner 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 votre ami, utilisez-les. 

3
fishjd

prend 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>
2
indrajeet
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
            }
        );
2
kaub0st3r

La meilleure façon que je pense serait d'avoir un flagitemselected = 0; dans oncreate. Et sur l'élément sélectionné, l'événement incrémente cet indicateur i.e flagitemselected ++; puis vérifiez si (flagitemselected! = 1) {// faites votre travail ici}. Cela vous aidera, je suppose

0
Pinakin

Une astuce que j'ai trouvée a été de mettre vos setOnItemSelectedListeners dans onWindowFocusChanged au lieu de onCreate. Je n'ai pas encore trouvé d'effets secondaires nocifs. Fondamentalement, configurez les écouteurs une fois la fenêtre dessinée. Je ne sais pas à quelle fréquence onWindowFocusChanged s'exécute, mais il est assez facile de créer vous-même une variable de verrouillage si vous la trouvez s'exécutant trop souvent.

Je pense qu'Android utilise peut-être un système de traitement basé sur un message, et si vous mettez tout cela dans onCreate, vous risquez de vous retrouver dans des situations où la visionneuse est remplie après son tracé. Ainsi, votre auditeur se déclenchera une fois que vous aurez défini l'emplacement de l'élément. C'est une supposition éclairée, bien sûr, mais n'hésitez pas à me corriger à ce sujet.

0
Joe Plante

Cela fonctionnera Initialise la roulette et findviewbyid et l'utiliser, cela fonctionnera 

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

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

    });
0
sanjay

Brillant ce qui précède par Stefan Klumpp m'a également beaucoup aidé. Merci . Je suis un débutant et le "@Override" s dans il a provoqué une erreur sur "doit remplacer une méthode Super class du même nom". Eclipse m'a suggéré de supprimer les dérogations. Quand j'ai fait ça, ça a fonctionné. S'il vous plaît ne me demandez pas comment ou pourquoi.

0
user241569