Question

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

En fait ce que je suis en train de faire quelque chose de similaire à ceci:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
Était-ce utile?

La solution

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

  

A spinner ne supporte pas l'article, cliquez   événements. L'appel de cette méthode soulèvera   une exception.

Une meilleure utilisation OnItemSelectedListener () 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 invoqué lorsque la vue est en cours de construction, de sorte que vous pouvez envisager de mettre à l'intérieur appel de la méthode onCreate().

Autres conseils

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;
    } 
}); 

Remarque: Rappelez-vous une chose.

événement Spinner OnItemSelectedListener exécutera deux fois:

  1. initialisation Spinner
  2. utilisateur sélectionné manuellement

Essayez de différencier ces deux variables à l'aide du drapeau.

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

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

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

surchargent Ensuite, 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("");
}

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

Vous pouvez éviter la OnItemSelectedListener () étant appelée avec une simple vérification. Stocker l'index de sélection en cours dans une variable entière et vérifier dans le 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 la cause du iCurrentSelection devrait être portée d'objet pour que cela fonctionne!

Trouvez votre nom de spinner et trouver id mettre en œuvre 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
    }
});

Les documents pour la fileuse-widget dit

  

Une fileuse ne supporte pas les événements de clic de l'article.

Vous devez utiliser setOnItemSelectedListener pour traiter votre problème.

Peu importe vous mettre OnItemSelectedListener dans onCreate ou onStart - il sera toujours appelé lors de la création d'activité ou start (respectivement)
. Ainsi, nous pouvons le mettre en onCreate (et non pas dans onStart!).
Il suffit d'ajouter un indicateur pour déterminer la première initialisation:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

puis dans onCreate (ou onCreateView) juste:

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;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

Si vous voulez un vrai onChangedListener (). Conservez la valeur initiale dans le gestionnaire et vérifier si elle a changé. Il est simple et fait pas nécessitent 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 vos amis, de les utiliser.

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
            }
        );

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>

Cela fonctionne intialize la fileuse et findViewById et 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
        }

    });

La meilleure façon ce que je pense, serait d'avoir un flagitemselected = 0; dans onCreate(). Et sur le point sélectionné incrément d'événement drapeau i.e. flagitemselected++; puis vérifiez

if(flagitemselected!=1)
{
// do your work here
}

Cela vous aidera, je suppose.

Une astuce que j'ai trouvé mettre vos setOnItemSelectedListeners en onWindowFocusChanged au lieu de onCreate. Je ne l'ai pas trouvé de mauvais effets secondaires à le faire de cette façon, encore. En gros, mettre en place les auditeurs après la fenêtre est dessiné. Je ne sais pas combien de fois onWindowFocusChanged fonctionne, mais il est assez facile de vous créer une variable de verrouillage si vous trouvez qu'il est en cours d'exécution trop souvent.

Je pense que Android utilise peut-être un système de traitement à base de messages, et si vous mettez tout en onCreate, vous pouvez exécuter dans des situations où la fileuse se peuplé après est dessiné. Ainsi, votre auditeur se déclenche au large après avoir défini l'emplacement de l'élément. Ceci est une supposition, bien sûr, mais ne hésitez pas à me corriger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top