Android Spinner: Holen Sie sich das ausgewählte Element Änderungsereignis
-
20-09-2019 - |
Frage
Wie kann man den Ereignis-Listener für einen Spinner gesetzt, wenn das ausgewählte Element ändert?
Im Grunde, was ich versuche zu tun, etwas Ähnliches wie folgt aus:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
Lösung
Einige der bisherigen Antworten sind nicht korrekt. Sie arbeiten für andere Widgets und Ansichten, aber die Dokumentation für die Spinner-Widget eindeutig fest:
Ein Spinner nicht unterstützt Artikel klicken Veranstaltungen. Das Aufrufen dieser Methode wird angehoben eine Ausnahme.
Bessere verwenden OnItemSelectedListener () statt:
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
}
});
Das funktioniert für mich.
Beachten Sie, dass onItemSelected Methode auch aufgerufen, wenn die Ansicht Build wird, so können Sie prüfen es in onCreate()
Methodenaufruf setzen.
Andere Tipps
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;
}
});
Hinweis: Denken Sie daran, eine Sache.
Spinner OnItemSelectedListener
Ereignis wird ausgeführt, zweimal:
- Spinner Initialisierung
- Benutzer ausgewählt manuell
Versuchen Sie diese beiden unter Verwendung Flagvariable zu unterscheiden.
Sie können AdapterView.OnItemSelectedListener
Klasse in Ihrer Aktivität implementieren.
Und dann die Verwendung unterhalb der Linie innerhalb onCreate()
Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
Dann überschreibt diese beiden Methoden:
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
Sie können die OnItemSelectedListener vermeiden () mit einem einfachen Test aufgerufen werden. Speicher, um den aktuellen Auswahlindex in einer Integer-Variablen und Prüfung innerhalb des onItemSelected (..) vor etwas zu tun
Z. B:
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;
}
});
Von der Ursache des iCurrentSelection
im Objekt Rahmen für diese Arbeit sein soll!
Finden Sie Ihren Spinner Namen und finden id dann diese Methode implementieren.
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
}
});
Die Dokumentation für den Spinner-Widget sagt
Ein Spinner nicht Artikel Click-Ereignisse unterstützen.
Sie sollten setOnItemSelectedListener
verwenden, Ihr Problem zu behandeln.
Es spielt keine Rolle, werden Sie setzen OnItemSelectedListener in onCreate oder onStart - es wird noch während der Aktivitätserstellung oder starten (bzw.) aufgerufen werden
.
Also haben wir es in onCreate (und NICHT in onStart!) Einstellen.
Fügen Sie einfach ein Flag, um herauszufinden, Erstinitialisierung:
private Spinner mSpinner;
private boolean mSpinnerInitialized;
dann in onCreate (oder onCreateView) nur:
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
}
);
Wenn Sie ein wahrer onChangedListener (). Lagern Sie den Anfangswert in dem Handler und prüfen, ob sie sich geändert hat. Es ist einfach und macht nicht eine globale Variable erfordern. Arbeiten, wenn Sie mehr als ein Spinner auf der Seite haben.
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;
}
}
Objekte sind dein Freund, sie verwenden.
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
}
);
nimmt eine globale Variable für aktuelle Auswahl der 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>
Dies funktioniert intialize den Spinner und findViewById und verwenden diese wird es funktionieren
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
}
});
Der beste Weg, was ich denke, wäre eine flagitemselected = 0;
in onCreate()
zu haben. Und zum Produkt ausgewählte Ereignis Schritt das Flag d.h flagitemselected++
; und dann überprüfen
if(flagitemselected!=1)
{
// do your work here
}
Dies wird helfen, denke ich.
Ein Trick, den ich gefunden wurde, setzen Sie Ihre setOnItemSelectedListeners in statt onCreate onWindowFocusChanged. Ich habe keine schlechten Nebenwirkungen zu tun es auf diese Weise, noch nicht gefunden. Grundsätzlich eingerichtet, um die Zuhörer, nachdem das Fenster gezogen wird. Ich bin nicht sicher, wie oft läuft onWindowFocusChanged, aber es ist einfach genug, um sich eine Sperrvariable zu erstellen, wenn Sie es finden, zu oft ausgeführt wird.
ich glaube, Android könnte ein nachrichtenbasierte Verarbeitungssystem verwenden, und wenn man sie alle in onCreate setzen, können Sie in Situationen führen, wo der Spinner bevölkert nachdem sie gezogen wird. So wird Ihre Zuhörer abfeuern, nachdem Sie die Position des Elements festgelegt. Das ist eine Vermutung, natürlich, aber ich fühle mich frei, mich auf das korrigieren.