J'ai créé une application Android avec un Spinner
et un TextView
. Je souhaite afficher l'élément sélectionné dans la liste déroulante du Spinner dans TextView. J'ai implémenté le Spinner dans la onCreate
méthode, donc lorsque j'exécute le programme, il affiche une valeur dans le TextView
(avant de sélectionner un élément dans la liste déroulante).
Je souhaite afficher la valeur dans TextView uniquement après avoir sélectionné un élément dans la liste déroulante. Comment puis-je faire cela?
Voici mon code:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class GPACal01Activity extends Activity implements OnItemSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
TextView textView = (TextView) findViewById(R.id.textView1);
String str = (String) parent.getItemAtPosition(pos);
textView.setText(str);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
android
android-layout
android-spinner
Subvention
la source
la source
Réponses:
Donc, la première fois, gérez cela avec une valeur entière
Exemple: prendre initialement
int check = 0;
Vous pouvez le faire avec une valeur booléenne et également en vérifiant les positions actuelles et précédentes. Vois ici
la source
Mettez simplement cette ligne avant de définir OnItemSelectedListener
la source
setSelection(int, boolean)
appels ensetSelectionInt()
interne et vous devez définir l'écouteur après (au lieu d'avant) l'appel. Attention celasetSelection(int)
ne fonctionnera pas, car cela appelle ensetNextSelectedPositionInt()
interne, et c'est ce qui m'a conduit ici.À partir du niveau d'API 3, vous pouvez utiliser onUserInteraction () sur une activité avec un booléen pour déterminer si l'utilisateur interagit avec l'appareil.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
En tant que champ de l'activité que j'ai:
Enfin, mon spinner:
Au fur et à mesure que vous avancez dans l'activité, la valeur booléenne est réinitialisée à false. Fonctionne comme un charme.
la source
Cela a fonctionné pour moi
L'initialisation de Spinner dans Android est problématique, parfois le problème ci-dessus a été résolu par ce modèle.
L'adaptateur de configuration doit être la première partie et onItemSelectedListener (this) sera le dernier lors de l'initialisation d'un spinner. Par le modèle ci-dessus, mon OnItemSelected () n'est pas appelé lors de l'initialisation du spinner
la source
haha ... J'ai la même question. Quand initViews () fait comme ceci: la séquence est la clé, l'auditeur est le dernier. Bonne chance !
la source
Ma solution:
la source
Pour éviter d'appeler spinner.setOnItemSelectedListener () lors de l'initialisation
la source
Vous pouvez le faire de cette manière:
Au début, je crée un auditeur et attribué à un rappel variable; puis je crée un deuxième auditeur anonyme et quand cela est appelé à un premier moment, cela change l'auditeur =]
la source
L'indicateur d'interaction de l'utilisateur peut alors être défini sur true dans la méthode onTouch et réinitialisé
onItemSelected()
une fois que le changement de sélection a été traité. Je préfère cette solution car l'indicateur d'interaction de l'utilisateur est géré exclusivement pour le spinner, et non pour les autres vues de l'activité qui peuvent affecter le comportement souhaité.Dans du code:
Créez votre auditeur pour le spinner:
Ajoutez l'auditeur à la double flèche en tant que an
OnItemSelectedListener
et anOnTouchListener
:la source
Une solution simple similaire qui permet plusieurs spinners consiste à placer AdapterView dans une collection - dans la superclasse Activités - lors de la première exécution de onItemSelected (...) Ensuite, vérifiez si AdapterView est dans la collection avant de l'exécuter. Ceci active un ensemble de méthodes dans la superclasse et prend en charge plusieurs AdapterViews et par conséquent plusieurs fileurs.
Superclasse ...
Sous-classe ...
}
la source
créer un champ booléen
à l'intérieur d'une création de l'activité
la source
Essaye ça
la source
Vous pouvez y parvenir par setOnTouchListener d'abord puis setOnItemSelectedListener dans onTouch
la source
Cela a fonctionné pour moi:
la source
Basé sur la réponse d'Abhi, j'ai fait cet auditeur simple
la source
J'ai eu le même problème et cela fonctionne pour moi:
J'ai 2 spinners et je les mets à jour pendant l'initialisation et pendant les interactions avec d'autres contrôles ou après avoir obtenu des données du serveur.
Voici mon modèle:
Lorsque la classe démarre, utilisez setSpinnersListeners () au lieu de définir directement l'écouteur.
Le Runnable empêchera le spinner de déclencher onItemSelected juste après que vous ayez défini leurs valeurs.
Si vous avez besoin de mettre à jour le spinner (après un appel au serveur, etc.), utilisez removeSpinnersListeners () juste avant vos lignes de mise à jour et setSpinnersListeners () juste après les lignes de mise à jour. Cela empêchera onItemSelected de se déclencher après la mise à jour.
la source
Code
la source
Pour moi, la solution d'Abhi fonctionne très bien jusqu'au niveau Api 27.
Mais il semble qu'à partir du niveau 28 d'API, onItemSelected () ne soit pas appelé lorsque l'écouteur est défini, ce qui signifie que onItemSelected () n'est jamais appelé.
Par conséquent, j'ai ajouté une courte instruction if pour vérifier le niveau de l'API:
Je pense que c'est assez étrange et je ne suis pas sûr que d'autres aient également ce problème, mais dans mon cas, cela a bien fonctionné.
la source
J'ai placé un TextView au-dessus du Spinner, de la même taille et du même arrière-plan que le Spinner, afin d'avoir plus de contrôle sur ce à quoi il ressemblait avant que l'utilisateur ne clique dessus. Avec le TextView là-bas, je pourrais également utiliser le TextView pour signaler lorsque l'utilisateur a commencé à interagir.
Mon code Kotlin ressemble à ceci:
Le fichier de mise en page ressemble à ceci, la partie importante étant que le Spinner et TextView partagent la même largeur, hauteur et marges:
Je suis sûr que les autres solutions fonctionnent là où vous ignorez le premier appel onItemSelected, mais je n'aime vraiment pas l'idée de supposer qu'il sera toujours appelé.
la source