Android Spinner: Obtenez l'événement de modification de l'élément sélectionné
-
20-09-2019 - |
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
}
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:
- initialisation Spinner
- 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.