Jak ustawić detektor zdarzeń dla pokrętła, gdy zmienia się wybrany element?
Zasadniczo próbuję zrobić coś podobnego do tego:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
Jak ustawić detektor zdarzeń dla pokrętła, gdy zmienia się wybrany element?
Zasadniczo próbuję zrobić coś podobnego do tego:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
Odpowiedzi:
Niektóre z poprzednich odpowiedzi są nieprawidłowe. Działają w przypadku innych widżetów i widoków, ale dokumentacja widżetu Spinner wyraźnie stwierdza:
Błystka nie obsługuje zdarzeń kliknięcia przedmiotu. Wywołanie tej metody spowoduje wyjątek.
Lepiej użyj zamiast tego OnItemSelectedListener () :
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
}
});
To działa dla mnie.
Zauważ, że metoda onItemSelected jest również wywoływana podczas budowania widoku, więc możesz rozważyć umieszczenie go w onCreate()
wywołaniu metody.
onItemSelected(...)
nie jest trafiony. (Wiem, bo właśnie dowiedziałem się tego na
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;
}
});
Uwaga: pamiętaj o jednej rzeczy.
OnItemSelectedListener
Event Spinner zostanie wykonany dwukrotnie:
Spróbuj rozróżnić te dwa, używając zmiennej flag.
Możesz zaimplementować AdapterView.OnItemSelectedListener
zajęcia w swojej działalności.
A następnie użyj poniższej linii onCreate()
Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
Następnie zastąp te dwie metody:
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
Można uniknąć wywołania OnItemSelectedListener () za pomocą prostego sprawdzenia: Zachowaj bieżący indeks wyboru w zmiennej całkowitej i sprawdź w onItemSelected (..) zanim cokolwiek zrobisz.
Na przykład:
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;
}
});
Przyczyna iCurrentSelection
powinna być w zakresie obiektowym, aby to działało!
iCurrentSelection
zmienna zostanie zadeklarowana w tej anonimowej klasie, będzie działać dobrze. Możesz zainicjować go na -1, aby kod był wykonywany przy pierwszym wywołaniu.
Znajdź nazwę przędzarki i znajdź identyfikator, a następnie zastosuj tę metodę.
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
}
});
Nie ma znaczenia, czy ustawisz OnItemSelectedListener w onCreate czy onStart - będzie on nadal wywoływany podczas tworzenia lub uruchamiania działania (odpowiednio).
Możemy więc ustawić go w onCreate (a NIE w onStart!).
Wystarczy dodać flagę, aby wymyślić pierwszą inicjalizację:
private Spinner mSpinner;
private boolean mSpinnerInitialized;
następnie w onCreate (lub onCreateView) wystarczy:
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;
}
});
Dokumenty dotyczące widżetu typu spinner mówią
Błystka nie obsługuje zdarzeń kliknięcia przedmiotu.
Powinieneś użyć, setOnItemSelectedListener
aby poradzić sobie z problemem.
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
weź zmienną globalną dla bieżącego wyboru pokrętła:
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>
Jeśli chcesz true onChangedListener (). Zapisz wartość początkową w module obsługi i sprawdź, czy uległa zmianie. Jest prosty i nie wymaga zmiennej globalnej. Działa, jeśli na stronie znajduje się więcej niż jedna przędzarka.
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;
}
}
Przedmioty są twoim przyjacielem, używaj ich.
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
}
);
To zadziała, zainicjalizuj pokrętło i znajdź viewbyid i użyj tego, to zadziała
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
}
});
Jedną sztuczką, którą znalazłem, było umieszczenie twoich setOnItemSelectedListeners w onWindowFocusChanged zamiast onCreate. Nie znalazłem jeszcze żadnych złych skutków ubocznych, aby robić to w ten sposób. Zasadniczo skonfiguruj detektory po narysowaniu okna. Nie jestem pewien, jak często działa onWindowFocusChanged, ale łatwo jest stworzyć sobie zmienną blokującą, jeśli okaże się, że działa zbyt często.
Myślę, że Android może korzystać z systemu przetwarzania opartego na wiadomościach, a jeśli włożysz to wszystko do programu onCreate, możesz napotkać sytuacje, w których błystka zostanie zapełniona po jej wyciągnięciu. Twój słuchacz odpali po ustawieniu lokalizacji przedmiotu. Jest to oczywiście wykształcone przypuszczenie, ale możesz mnie poprawić w tej kwestii.
Domyślnie otrzymasz pierwszy element tablicy przędzarki
value = spinner.getSelectedItem().toString();
za każdym razem, gdy wybierzesz wartość w pokrętle, otrzymasz wybraną wartość
jeśli chcesz pozycję wybranego elementu, zrób to w ten sposób
pos = spinner.getSelectedItemPosition();
powyższe dwie odpowiedzi dotyczą bez zastosowania detektora