Ich möchte einen Spinner verwenden, der anfangs (wenn der Benutzer noch keine Auswahl getroffen hat) den Text "Select One" anzeigt. Wenn der Benutzer auf den Drehknopf klickt, wird die Liste der Elemente angezeigt und der Benutzer wählt eine der Optionen aus. Nachdem der Benutzer eine Auswahl getroffen hat, wird das ausgewählte Element im Spinner anstelle von "Select One" angezeigt.
Ich habe den folgenden Code, um einen Spinner zu erstellen:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Mit diesem Code wird zunächst der Punkt "Eins" angezeigt. Ich könnte einfach ein neues Element "Select One" zu den Elementen hinzufügen, aber dann würde "Select One" auch in der Dropdown-Liste als erstes Element angezeigt, was nicht das ist, was ich möchte.
Wie kann ich dieses Problem beheben?
android
android-spinner
Pieter Kuijpers
quelle
quelle
Antworten:
Hier ist eine allgemeine Lösung, die die
Spinner
Ansicht überschreibt . Es überschreibtsetAdapter()
, um die Anfangsposition auf -1 zu setzen, und überträgt die angegebeneSpinnerAdapter
Position, um die Eingabeaufforderungszeichenfolge für eine Position unter 0 anzuzeigen.Dies wurde auf Android 1.5 bis 4.2 getestet, aber Käufer aufgepasst! Weil diese Lösung auf Reflexion beruht, um das private
AdapterView.setNextSelectedPositionInt()
und zu nennenAdapterView.setSelectedPositionInt()
, es ist nicht garantiert , um Arbeit in Zukunft OS - Updates. Es scheint wahrscheinlich, dass es wird, aber es ist keineswegs garantiert.Normalerweise würde ich so etwas nicht gutheißen, aber diese Frage wurde oft genug gestellt und es scheint eine vernünftige Anfrage zu sein, dass ich dachte, ich würde meine Lösung veröffentlichen.
quelle
Was Sie tun können, ist, Ihre
SpinnerAdapter
Ansicht mit einer zu dekorieren, die zunächst die Ansicht "Auswahloption ..." enthält, damit der Spinner sie ohne Auswahl anzeigt.Hier ist ein Arbeitsbeispiel, das für Android 2.3 und 4.0 getestet wurde (es verwendet nichts in der Kompatibilitätsbibliothek, daher sollte es für eine Weile in Ordnung sein). Da es sich um einen Dekorateur handelt, sollte es einfach sein, vorhandenen Code nachzurüsten, und es funktioniert auch gut mit
CursorLoader
s. (Cursor auf dem WrapcursorAdapter
natürlich tauschen ...)Es gibt einen Android-Fehler, der die Wiederverwendung von Ansichten etwas erschwert. (Sie müssen also das
setTag
oder etwas anderes verwenden, um sicherzustellen, dassconvertView
es korrekt ist.) Spinner unterstützt nicht mehrere AnsichtstypenCode-Hinweise: 2 Konstruktoren
Auf diese Weise können Sie eine Standardaufforderung verwenden oder Ihr eigenes "Nichts ausgewählt" als erste Zeile oder beides oder keine definieren. (Hinweis: Einige Themen zeigen ein DropDown für einen Spinner anstelle eines Dialogfelds. Das Dropdown zeigt normalerweise nicht die Eingabeaufforderung an.)
Sie definieren ein Layout so, dass es wie eine Eingabeaufforderung aussieht, z. B. ausgegraut ...
Verwenden einer Standardaufforderung (beachten Sie, dass nichts ausgewählt ist):
Oder mit einer Eingabeaufforderung und etwas Dynamischem (hätte auch keine Eingabeaufforderung haben können):
Verwendung im obigen Beispiel
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
quelle
Ich habe
Button
stattdessen eine verwendet. Während aButton
kein a istSpinner
, lässt sich das Verhalten leicht anpassen.Erstellen Sie zuerst den Adapter wie gewohnt:
Beachten Sie, dass ich die
simple_spinner_dropdown_item
als Layout-ID verwende. Auf diese Weise können Sie beim Erstellen des Warnungsdialogs ein besseres Erscheinungsbild erzielen.Im onClick-Handler für meinen Button habe ich:
Und das ist es!
quelle
Zunächst könnte Sie das
prompt
Attribut derSpinner
Klasse interessieren . Siehe das Bild unten, "Choose a Planet" ist die Eingabeaufforderung, mit der im XML festgelegt werden kannandroid:prompt=""
.Ich wollte eine Unterklasse vorschlagen
Spinner
, in der Sie zwei Adapter intern warten können. Ein Adapter mit der Option "Select One" und der andere echte Adapter (mit den tatsächlichen Optionen) verwenden dann denOnClickListener
, um die Adapter zu wechseln, bevor das Auswahldialogfeld angezeigt wird. Nachdem ich versucht habe, diese Idee umzusetzen, bin ich jedoch zu dem Schluss gekommen, dass Sie keineOnClick
Ereignisse für das Widget selbst empfangen können.Sie könnten den Spinner in eine andere Ansicht einwickeln, die Klicks auf die Ansicht abfangen und dann Ihren
CustomSpinner
Adapter wechseln, aber es scheint ein schrecklicher Hack zu sein.Müssen Sie wirklich "Select One" anzeigen?
quelle
Dieser Code wurde getestet und funktioniert unter Android 4.4
quelle
getItem(getCount())
ist für mich rot unterstrichen? Methode setHintIch habe diese Lösung gefunden:
Ändern Sie einfach das Array [0] mit "Select One" und benennen Sie es dann in onItemSelected in "One" um.
Keine klassische Lösung, aber es funktioniert: D.
quelle
Es gibt keine Standard-API, um einen Hinweis auf Spinner festzulegen. Um es hinzuzufügen, benötigen wir eine kleine Problemumgehung ohne die Implementierung von Sicherheitsreflexionen
Adapterquelle:
Originalquelle
quelle
android.R.id.text1
getCount
MethodeViele Antworten hier, aber ich bin überrascht, dass niemand eine einfache Lösung vorgeschlagen hat: Platzieren Sie eine Textansicht auf dem Spinner. Legen Sie in der Textansicht einen Klick-Listener fest, der die Textansicht verbirgt, die den Spinner anzeigt, und spinner.performClick () aufruft.
quelle
Ich hatte das gleiche Problem für Spinner mit einer leeren Auswahl und fand eine bessere Lösung. Schauen Sie sich diesen einfachen Code an.
Hier ist Spinneradapter eine kleine Anpassung für Arrayadapter. Es sieht aus wie das:
quelle
Sie können es in eine Textansicht ändern und Folgendes verwenden:
und definieren Sie dann die
android:text
Eigenschaft.quelle
XML-Datei:
Aktivität:
onCreate:
Einige Funktionen (Dinge programmgesteuert zum Adapter hinzufügen)>
Jetzt haben Sie einen leeren Spinner und können Code schreiben, um den Dialog nicht zu öffnen, wenn er leer ist. Oder sie können zurückdrücken. Sie füllen es aber auch zur Laufzeit mit einer Funktion oder einer anderen Liste.
quelle
Ich habe wie folgt versucht. Nehmen Sie eine Schaltfläche und geben Sie das Klickereignis an. Durch Ändern des Schaltflächenhintergrunds scheint es sich um einen Spinner zu handeln.
Als globale Variablen deklarieren alertdialog und Standardwert.
quelle
Das ist mein Weg:
quelle
In der iosched-App finden Sie eine allgemeine Lösung zum Hinzufügen eines Elements zum Anfang einer Liste. Insbesondere wenn Sie einen Adapter Cursor verwenden, sehen Sie TracksAdapter.java , die diese Definition erstreckt sich ein „setHasAllItem“ Verfahren und eine zugehörigen Code , um die Liste Zahl , um mit dem zusätzlichen Elemente oben zu verwalten.
Mit dem benutzerdefinierten Adapter können Sie den Text auf "Select One" oder was auch immer Sie möchten, dass das oberste Element sagt.
quelle
Ich habe einen Spinner auf meiner main.xml und seine ID ist
@+id/spinner1
Folgendes schreibe ich in meine OnCreate-Funktion:
Es braucht keine Implementierung in der Klasse.
quelle
Ich habe dafür viele gute Lösungen gefunden. Die meisten arbeiten, indem sie ein Element am Ende des Adapters hinzufügen und nicht das letzte Element in der Dropdown-Liste anzeigen. Das große Problem für mich war, dass die Spinner-Dropdown-Liste am Ende der Liste beginnt. Der Benutzer sieht also die letzten Elemente anstelle der ersten Elemente (falls viele Elemente angezeigt werden müssen), nachdem er den Spinner zum ersten Mal berührt hat.
Also habe ich den Hinweis an den Anfang der Liste gesetzt. und verstecken Sie das erste Element in der Dropdown-Liste.
Legen Sie das folgende Layout in @Override getDropDownView () fest, wenn die Position 0 ist, um die erste Hinweiszeile auszublenden.
R.layout.spinner_hint_list_item_layout:
quelle
Darüber hinaus gibt es einen einfachen Trick, um die Standardeinstellung anzuzeigen:
Sie können Ihrer Liste einen Standardwert hinzufügen und dann Ihre gesamte Sammlung mit hinzufügen
list.addAll(yourCollection);
Beispiel für einen funktionsfähigen Code hier:
Hoffe, es wird Ihre Komplexität wiederherstellen. Viel Spaß beim Codieren!
quelle
Ich denke, der einfachste Weg ist, ein Dummy-Element auf Index 0 zu erstellen, das "select one" sagt, und dann beim Speichern möglicherweise zu überprüfen, ob die Auswahl nicht 0 ist.
quelle
Dies ist also mein letztes Beispiel "All-in" für einen Button-Spinner
In activity_my_form.xml
In strings.xml
In MyFormActivity.java
Endlich habe ich eine konfigurierbare Schriftgröße erhalten, bei der kein erster Artikel ausgewählt werden kann !!! Vielen Dank an HRJ
quelle
Beim Erweitern
SpinnerAdapter
überschreiben Sie zweiView
produzierende MethodengetView(int, View, ViewGroup)
undgetDropDownView(int, View, ViewGroup)
. Der erste liefert dasView
in sichSpinner
selbst eingefügte ; Die zweite enthält dieView
in der Dropdown-Liste (wie der Name schon sagt). Sie können das überschreiben,getView(...)
sodass bis zur Auswahl eines ElementsTextView
eine Eingabeaufforderung angezeigt wird. Wenn Sie dann feststellen, dass ein Element ausgewählt wurde, ändern Sie es so, dass einTextView
entsprechendes Element angezeigt wird .quelle
Spinner
Tutorial (das angeblich einToast
NACH der Auswahl eines Elements anzeigt ) dieses OUGHT funktionieren sollte: developer.android.com/resources/tutorials/views/…Für diejenigen, die Xamarin verwenden, ist hier das C #, das der obigen Antwort von aaronvargas entspricht.
quelle
Ich habe dieses Problem auch mit dem folgenden Code gelöst. Angenommen, Sie haben eine Liste von Elementen, z
Jetzt müssen wir die Zeichenfolgen für den Spinner bereitstellen, da der Spinner das Objekt nicht verstehen kann. Also werden wir eine neue Array-Liste mit String-Elementen wie diesem erstellen ->
Jetzt haben wir eine
itemStringArrayList
Array-Liste mit zwei String-Elementen. Und wir müssen den Text "Artikel auswählen" als ersten Artikel anzeigen. Also müssen wir einen neuen String in das einfügenitemStringArrayList
.Jetzt haben wir eine Array-Liste
itemsArrayList
und möchten zwei Elemente in der Dropdown- anzeigen. Aber die Bedingung hier ist ... Wenn wir dann nichts auswählenSelect Item
sollte es als erstes Element erscheinen, das nicht aktiviert wird.So können wir diese Funktionalität so implementieren. Wenn Sie die Array-Listenelemente in den Android-Spinner laden müssen. Sie müssen also einen Adapter verwenden. Also hier werde ich die verwenden
ArrayAdapter
. Wir können auch den Anpassungsadapter verwenden.Hier in diesem Code. Wir verwenden das angepasste Spinner-Layout, dh
R.layout.spinner_item
. Es ist eine einfache TextansichtWir müssen den ersten Text im Spinner deaktivieren. Für die Position 0 deaktivieren wir also den Text. Und Farbe können wir auch festlegen, indem wir die Methode getDropDownView überschreiben. Auf diese Weise erhalten wir den erwarteten Spinner.
quelle
Ich würde nur eine RadioGroup mit RadioButtons verwenden, wenn Sie nur drei Möglichkeiten haben, können Sie sie alle zunächst deaktivieren.
quelle
Keine der zuvor eingereichten Antworten funktionierte wirklich so, wie ich dieses Problem lösen wollte. Für mich würde die ideale Lösung das "Select One" (oder einen beliebigen Anfangstext) liefern, wenn der Spinner zum ersten Mal angezeigt wird. Wenn der Benutzer auf den Drehknopf tippt, sollte der ursprüngliche Text nicht Teil der angezeigten Dropdown-Liste sein.
Um meine spezielle Situation weiter zu verkomplizieren, kommen meine Spinnerdaten von einem Cursor, der über die LoaderManager-Rückrufe geladen wird.
Nach ausgiebigen Experimenten habe ich folgende Lösung gefunden:
quelle
Ich kümmere mich darum, indem ich einen Knopf anstelle eines Spinners benutze. Ich habe das Beispielprojekt auf GitHub.
Im Projekt zeige ich sowohl den Spinner als auch die Schaltfläche an, um zu zeigen, dass sie tatsächlich identisch aussehen. Mit Ausnahme der Schaltfläche können Sie den Anfangstext auf einen beliebigen Wert einstellen.
So sieht die Aktivität aus:
HINWEIS: Ja, mir ist klar, dass dies vom angewendeten Thema abhängt und das Aussehen bei Verwendung von Theme.Holo geringfügig abweicht. Wenn Sie jedoch eines der älteren Themen wie Theme.Black verwenden, können Sie loslegen.
quelle
Wenn Sie mit diesem Problem konfrontiert sind, wenn Ihre Elemente vom Datenbankcursor ausgefüllt werden ,
Die einfachste Lösung, die ich in dieser SO-Antwort gefunden habe:
Verwenden Sie UNION in Ihrer Cursoradapterabfrage und fügen Sie das zusätzliche Element mit der ID = -1 zum Abfrageergebnis hinzu, ohne es wirklich zur Datenbank hinzuzufügen:
etwas wie:
Wenn das ausgewählte Element -1 ist, ist dies der Standardwert. Ansonsten ist es ein Datensatz aus der Tabelle.
quelle
Scheint eine banale Lösung zu sein, aber normalerweise platziere ich einfach eine Textansicht vor dem Spinner. Die ganze XML sieht so aus. (Hey Leute, erschieß mich nicht, ich weiß, dass einige von euch diese Art von Ehe nicht mögen):
Dann verstecke ich die Textansicht, wenn ein Element ausgewählt wurde. Offensichtlich sollte die Hintergrundfarbe der Textansicht mit der des Spinners übereinstimmen. Funktioniert unter Android 4.0. Weiß nicht auf älteren Versionen.
Ja. Da der Spinner zu Beginn setOnItemSelectedListener aufruft, kann das Ausblenden der Textansicht etwas schwierig sein, kann aber folgendermaßen erfolgen:
quelle
bei mir hat es so ähnlich geklappt. hat die Verbesserung, dass nur der Text in einigen Optionen geändert wird, nicht in allen.
Zuerst nehme ich die Namen des Spinners und erstelle den Arrayadapter mit einer benutzerdefinierten Ansicht, aber es spielt jetzt keine Rolle, der Schlüssel überschreibt die getView und innerhalb ändert sich die Werte, die Sie ändern müssen. In meinem Fall war nur der erste, der Rest lasse ich das Original
quelle
Hier ist eine einfache
quelle
Lesen Sie eine der oben genannten Antworten: https://stackoverflow.com/a/23005376/1312796
Ich habe meinen Code hinzugefügt, um einen kleinen Fehler zu beheben. Dort wurden keine Daten abgerufen. Wie wird der Eingabeaufforderungstext angezeigt?
Hier ist mein Trick ... Es funktioniert gut mit mir. !
Versuchen Sie, Ihren Spinner in ein Relative_layout zu legen, eine Textansicht an Ihrem Spinner auszurichten und mit der Sichtbarkeit der Textansicht (SHOW / HIDE) zu spielen, wenn der Adapter des Spinners geladen oder leer ist.
Hier ist der Code:
Rufen Sie diese Methode nach und vor dem Laden und Leeren des Spinneradapters auf.
quelle