Android Spinner schließen

7

Ich habe eine Aktivität mit einem Drehfeld und ich frage mich, ob es möglich ist, den Drehfeld programmgesteuert zu schließen, wenn der Benutzer es geöffnet hat.

Die ganze Geschichte ist, dass ich im Hintergrund einen Prozess auf einem separaten Thread laufe. Wenn der Prozess beendet ist, rufe ich einen Handler für die Hauptaktivität auf und führe abhängig vom Ergebnis einige Aufgaben aus. Dann möchte ich den Spinner schließen, der Benutzer hat ihn geöffnet.

Der Spinner befindet sich im main.xml-Layout:

%Vor%

und das ist der Handler:

%Vor%

Prost!

    
Markos Fragkakis 02.09.2011, 17:34
quelle

8 Antworten

7

Ich sehe keinen Weg dies zu erreichen - es gibt keine Methode auf Spinner , um es zu schließen. Der "offene" Teil eines Spinner ist ein AlertDialog auf Android 1.x und 2.x, und ich bin mir nicht ganz sicher, wie es bei Honeycomb implementiert wird, wenn das holografische Thema verwendet wird.

Die einzige Problemumgehung wäre, die Quelle für Spinner zu klonen und einen Code selbst hinzuzufügen, um den Dialog zu schließen. Aber es würde auch nicht auf Honeycomb oder höher funktionieren, bis Sie diesen Code auch sehen und klonen können.

Darüber hinaus würde ich denken, dass was Sie wollen, ist schlechte UX. Wenn der Benutzer Spinner geöffnet hat, werden die Inhalte Spinner sehr wahrscheinlich aktiv geprüft und eine Auswahl getroffen. Das unter ihrem Finger herauszureißen, wird sie bestenfalls verwirren. Bitte beachten Sie einen alternativen Ansatz.

Verwenden Sie auch nicht getApplicationContext() , es sei denn, Sie wissen warum Sie getApplicationContext() verwenden. Sie benötigen getApplicationContext() nicht oder wollen es gar nicht, wenn Sie eine ArrayAdapter erstellen.

    
CommonsWare 02.09.2011, 18:27
quelle
15

Das funktioniert für mich:

%Vor%

und der Klick-Listener:

%Vor%     
ayepin 30.03.2013 21:55
quelle
8

Nun, es ist ein wenig kompliziert als ich dachte.

Ich füge die Details Schritt für Schritt hier hinzu. Versuch es zu folgen. Das konnte ich in der 10. Stufe erreichen.

Bei dieser Lösung wird davon ausgegangen, dass Sie den Eingabeaufforderungsdialog programmatisch schließen sollen, wenn der Benutzer auf die Startschaltfläche klickt oder Sie zur nächsten Aktivität ohne Benutzerinteraktion wechseln müssen

Der erste Schritt besteht darin, einen benutzerdefinierten Spinner zu erstellen, indem Sie die Spinner-Klasse erweitern. Nehmen wir an, ich habe eine Klasse namens CustomSpinner im Paket com.bts.sampleapp

erstellt

Meine CustomSpinner-Klasse sieht so aus,

%Vor%

Ersetzen Sie jetzt in Ihrer Xml-Datei das Spinner-Element durch diesen benutzerdefinierten Spinner,

%Vor%

Der nächste Schritt ist das Initialisieren und Festlegen des Adapters für dieses Feld in Ihrer Aktivitätsklasse,

%Vor%

Der letzte Schritt besteht darin, den Dialog zu schließen, wenn der Benutzer auf HomeButton klickt oder wenn die Aktivität in den Hintergrund wechselt. Um dies zu tun, überschreiben wir die onPause () wie folgt,

%Vor%

Rufen Sie nun innerhalb der onPause () die Methode spin.onDetachedFromWindow(); auf, die den Auftrag ausführt, den Eingabeaufforderungsdialog für Sie zu schließen.

Nachdem Sie nun gesagt haben, dass spin.onDetachedFromWindow(); von überall in Ihrer Aktivität aufruft, sollten Sie den Spinner programmatisch schließen. Also, wenn dies das ist, was Sie wollen, dann entfernen Sie die onpause() .

    
Andro Selva 06.08.2013 09:37
quelle
3

Ich denke, Sie sollten Ihre Verwendung von Spinner verwerfen und stattdessen ein ImageView mit einem Frame Animation (zB <animation-list> ) um einen eigenen Spinner zu erstellen. Sie müssen nur den Hintergrund von ImageView so einstellen, dass er als Rahmenanimation dargestellt werden kann.

Dann können Sie leicht etwas tun so > um es zu starten und zu stoppen.

    
i_am_jorf 02.09.2011 18:32
quelle
1

Was ist mit dem Klonen eines "Zurück" -Tastenanschlags?

Ok, ich habe es gerade versucht

%Vor%

und es hat nichts getan, was ich sehen konnte - dann drückte die physische Rücktaste und das Drop-Down ging weg. Habe auch versucht, eine ACTION_UP direkt nach dem Down-No-Effekt zu machen.

    
user1064558 01.10.2012 20:36
quelle
1
%Vor%     
Sagar V.S. 24.10.2017 09:07
quelle
0

Sie möchten Ihre Spinner von überall her schließen. Key-Injektion für BACK gedrückt ist die gute Lösung, aber hier schließen Sie alle Ansichten auf einmal.

Wie wäre es mit setPressed (false)? Verknüpfung: Schließen Sie das Drop-down-Menü "Spinner", wenn zwei von allen in einer Gruppenansicht gleichzeitig angeklickt werden

    
Abhinav Saxena 09.06.2014 08:59
quelle
-1

Benutze clearFocus() , um den Spinner programmatisch zu schließen

%Vor%     
Vikas Kumbhar 22.04.2015 11:56
quelle

Tags und Links