Ich habe eine Android-Anwendung mit a Spinner
und a erstellt TextView
. Ich möchte das ausgewählte Element aus der Dropdown-Liste des Spinners in der Textansicht anzeigen. Ich habe den Spinner in die onCreate
Methode implementiert. Wenn ich das Programm ausführe, wird ein Wert in TextView
angezeigt (bevor ein Element aus der Dropdown-Liste ausgewählt wird).
Ich möchte den Wert in der Textansicht erst anzeigen, nachdem ich ein Element aus der Dropdown-Liste ausgewählt habe. Wie mache ich das?
Hier ist mein 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
Gewähren
quelle
quelle
Antworten:
Behandeln Sie dies also zum ersten Mal mit einem beliebigen Integer-Wert
Beispiel: Nehmen Sie zunächst
int check = 0;
Sie können dies mit einem booleschen Wert und auch durch Überprüfen der aktuellen und vorherigen Positionen tun. Siehe hier
quelle
Setzen Sie einfach diese Zeile, bevor Sie OnItemSelectedListener festlegen
quelle
setSelection(int, boolean)
AnrufesetSelectionInt()
intern, und Sie müssen den Hörer nach (statt vorher) ruft diese einzustellen. Vorsicht, dassetSelection(int)
wird nicht funktionieren, weil essetNextSelectedPositionInt()
intern anruft , und das hat mich hierher geführt.Ab API-Ebene 3 können Sie onUserInteraction () für eine Aktivität mit einem Booleschen Wert verwenden, um festzustellen, ob der Benutzer mit dem Gerät interagiert.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
Als Feld für die Aktivität habe ich:
Endlich mein Spinner:
Während Sie durch die Aktivität kommen und gehen, wird der Boolesche Wert auf false zurückgesetzt. Klappt wunderbar.
quelle
Das hat bei mir funktioniert
Die Initialisierung von Spinner in Android ist problematisch. Manchmal wurde das obige Problem durch dieses Muster gelöst.
Der Einstellungsadapter sollte der erste Teil sein und onItemSelectedListener (dies) wird der letzte sein, wenn ein Spinner initialisiert wird. Nach dem obigen Muster wird mein OnItemSelected () während der Initialisierung des Spinners nicht aufgerufen
quelle
haha ... ich habe die gleiche frage. Wenn initViews () einfach so läuft. Die Sequenz ist der Schlüssel, der Listener der letzte. Viel Glück !
quelle
Meine Lösung:
quelle
Sie können dies auf folgende Weise tun:
Zuerst erstelle ich einen Listener und ordne ihn einem variablen Rückruf zu. dann erstelle ich einen zweiten anonymen Listener und wenn dieser zum ersten Mal aufgerufen wird, ändert dies den Listener =]
quelle
Um zu vermeiden, dass spinner.setOnItemSelectedListener () während der Initialisierung aufgerufen wird
quelle
Das Benutzerinteraktionsflag kann dann in der onTouch-Methode auf true gesetzt und zurückgesetzt werden,
onItemSelected()
sobald die Auswahländerung vorgenommen wurde. Ich bevorzuge diese Lösung, da das Benutzerinteraktionsflag ausschließlich für den Spinner und nicht für andere Ansichten in der Aktivität behandelt wird, die das gewünschte Verhalten beeinflussen können.In Code:
Erstellen Sie Ihren Listener für den Spinner:
Fügen Sie den Listener dem Spinner als an
OnItemSelectedListener
und an hinzuOnTouchListener
:quelle
Eine ähnliche einfache Lösung, die mehrere Spinner ermöglicht, besteht darin, die AdapterView bei der ersten Ausführung von onItemSelected (...) in eine Sammlung - in der Superklasse Aktivitäten - zu stellen. Überprüfen Sie dann, ob sich die AdapterView in der Sammlung befindet, bevor Sie sie ausführen. Dies ermöglicht einen Satz von Methoden in der Oberklasse und unterstützt mehrere AdapterViews und damit mehrere Spinner.
Superklasse ...
Unterklasse ...
}}
quelle
Erstellen Sie ein boolesches Feld
innerhalb einer der Aktivitäten erstellen
quelle
Versuche dies
quelle
Sie können dies erreichen, indem Sie zuerst setOnTouchListener und dann setOnItemSelectedListener in onTouch festlegen
quelle
Das hat bei mir funktioniert:
quelle
Basierend auf Abhis Antwort habe ich diesen einfachen Zuhörer gemacht
quelle
Hatte das gleiche Problem und das funktioniert bei mir:
Ich habe 2 Spinner und aktualisiere sie während der Initialisierung und während der Interaktion mit anderen Steuerelementen oder nachdem ich Daten vom Server erhalten habe.
Hier ist meine Vorlage:
Verwenden Sie beim Starten der Klasse setSpinnersListeners (), anstatt den Listener direkt festzulegen .
Das Runnable verhindert, dass der Spinner direkt nach dem Festlegen der Werte auf ItemSelected ausgelöst wird.
Wenn Sie den Spinner aktualisieren müssen (nach einem Serveraufruf usw.), verwenden Sie removeSpinnersListeners () direkt vor Ihren Aktualisierungszeilen und setSpinnersListeners () direkt nach den Aktualisierungszeilen. Dadurch wird verhindert, dass onItemSelected nach dem Update ausgelöst wird.
quelle
Code
quelle
Für mich funktioniert Abhis Lösung bis zu Api Level 27 hervorragend.
Es scheint jedoch, dass ab API-Level 28 und höher onItemSelected () nicht aufgerufen wird, wenn der Listener festgelegt ist, was bedeutet, dass onItemSelected () niemals aufgerufen wird.
Daher habe ich eine kurze if-Anweisung hinzugefügt, um die API-Ebene zu überprüfen:
Ich finde das ziemlich seltsam und ich bin mir nicht sicher, ob andere auch dieses Problem haben, aber in meinem Fall hat es gut funktioniert.
quelle
Ich habe eine Textansicht auf dem Spinner platziert, die dieselbe Größe und denselben Hintergrund wie der Spinner hat, damit ich mehr Kontrolle darüber habe, wie sie aussieht, bevor der Benutzer darauf klickt. Mit der dortigen TextView könnte ich auch die TextView verwenden, um zu kennzeichnen, wann der Benutzer mit der Interaktion begonnen hat.
Mein Kotlin-Code sieht ungefähr so aus:
Die Layoutdatei sieht ungefähr so aus, wobei der wichtige Teil darin besteht, dass Spinner und TextView dieselbe Breite, Höhe und Ränder haben:
Ich bin mir sicher, dass die anderen Lösungen funktionieren, bei denen Sie den ersten Aufruf von onItemSelected ignorieren, aber die Idee, dass er immer aufgerufen wird, gefällt mir wirklich nicht.
quelle