Stworzyłem aplikację na Androida z rozszerzeniem Spinner
i TextView
. Chcę wyświetlić wybrany element z rozwijanej listy Spinner w TextView. Zaimplementowałem Spinner w onCreate
metodzie, więc kiedy uruchamiam program, pokazuje on wartość w TextView
(przed wybraniem pozycji z rozwijanej listy).
Chcę pokazać wartość w TextView dopiero po wybraniu elementu z rozwijanej listy. Jak mam to zrobic?
Oto mój kod:
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
Dotacja
źródło
źródło
Odpowiedzi:
Więc za pierwszym razem obsłuż to z dowolną wartością całkowitą
Przykład: Początkowo Take
int check = 0;
Możesz to zrobić z wartością logiczną, a także sprawdzając aktualne i poprzednie pozycje. Spójrz tutaj
źródło
Po prostu umieść tę linię przed ustawieniem OnItemSelectedListener
źródło
setSelection(int, boolean)
wywołujesetSelectionInt()
wewnętrznie i musisz ustawić odbiornik po (zamiast przed) wywołaniem tego. Uważaj,setSelection(int)
to nie zadziała, ponieważ dzwonisetNextSelectedPositionInt()
wewnętrznie i to mnie tu doprowadziło.Począwszy od poziomu interfejsu API 3, można użyć metody onUserInteraction () w działaniu z wartością logiczną, aby określić, czy użytkownik wchodzi w interakcję z urządzeniem.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
Jako pole na Aktywności mam:
Wreszcie mój spinner:
Gdy przychodzisz i przechodzisz przez działanie, wartość logiczna jest resetowana do wartości fałsz. Działa jak marzenie.
źródło
To zadziałało dla mnie
Inicjalizacja Spinnera w systemie Android jest problematyczna, czasami powyższy problem został rozwiązany przez ten wzorzec.
Ustawienie adaptera powinno być pierwszą częścią, a onItemSelectedListener (this) będzie ostatnim podczas inicjowania przędzarki. Według wzorca powyżej moja OnItemSelected () nie jest wywoływana podczas inicjalizacji przędzarki
źródło
haha ... mam to samo pytanie. Kiedy initViews () robi to w ten sposób: sekwencja jest kluczem, listener jest ostatnim. Powodzenia !
źródło
Moje rozwiązanie:
źródło
Aby uniknąć wywoływania spinner.setOnItemSelectedListener () podczas inicjalizacji
źródło
Możesz to zrobić w ten sposób:
Najpierw tworzę odbiornik i przypisuję zmienną callback; następnie tworzę anonimowego drugiego nasłuchiwania, a gdy jest to wywoływane po raz pierwszy, zmienia to listener =]
źródło
Znacznik interakcji użytkownika można następnie ustawić na wartość true w metodzie onTouch i zresetować
onItemSelected()
po dokonaniu zmiany wyboru. Preferuję to rozwiązanie, ponieważ flaga interakcji użytkownika jest obsługiwana wyłącznie dla przędzarki, a nie dla innych widoków w działaniu, które mogą wpływać na pożądane zachowanie.W kodzie:
Utwórz odbiornik dla spinnera:
Dodaj słuchacza do pokrętła zarówno jako an, jak
OnItemSelectedListener
i jakoOnTouchListener
:źródło
Podobnym prostym rozwiązaniem, które włącza wiele spinnerów, jest umieszczenie AdapterView w kolekcji - w nadklasie Działania - przy pierwszym wykonaniu onItemSelected (...) Następnie sprawdź, czy AdapterView znajduje się w kolekcji przed jego wykonaniem. Umożliwia to jeden zestaw metod w nadklasie i obsługuje wiele widoków AdapterViews, a tym samym wiele przędzarek.
Nadklasa ...
Podklasa ...
}
źródło
utwórz pole boolowskie
wewnątrz podczas tworzenia działania
źródło
Spróbuj tego
źródło
Można to osiągnąć najpierw przez setOnTouchListener, a następnie setOnItemSelectedListener w onTouch
źródło
To zadziałało dla mnie:
źródło
Na podstawie odpowiedzi Abhiego stworzyłem prostego słuchacza
źródło
Miałem ten sam problem i to działa dla mnie:
Mam 2 spinnerki i aktualizuję je podczas inicjalizacji i podczas interakcji z innymi kontrolkami lub po pobraniu danych z serwera.
Oto mój szablon:
Kiedy klasa jest inicjowana, użyj setSpinnersListeners () zamiast bezpośredniego ustawiania detektora.
Runnable zapobiegnie odpaleniu błystki onItemSelected zaraz po ustawieniu ich wartości.
Jeśli potrzebujesz zaktualizować spinner (po wywołaniu serwera itp.), Użyj removeSpinnersListeners () tuż przed liniami aktualizacji i setSpinnersListeners () tuż po liniach aktualizacji. Zapobiegnie to uruchomieniu onItemSelected po aktualizacji.
źródło
Kod
źródło
Dla mnie rozwiązanie Abhi działa świetnie do poziomu Api 27.
Wygląda jednak na to, że od poziomu 28 interfejsu API w górę onItemSelected () nie jest wywoływana, gdy ustawiono detektor, co oznacza, że onItemSelected () nigdy nie jest wywoływana.
Dlatego dodałem krótką instrukcję if, aby sprawdzić poziom interfejsu API:
Myślę, że to dość dziwne i nie jestem pewien, czy inni też mają ten problem, ale w moim przypadku zadziałało dobrze.
źródło
Umieściłem TextView na Spinner, o tym samym rozmiarze i tle co Spinner, aby mieć większą kontrolę nad tym, jak wygląda, zanim użytkownik go kliknie. Mając tam TextView, mógłbym również użyć TextView do oznaczenia, kiedy użytkownik rozpoczął interakcję.
Mój kod Kotlin wygląda mniej więcej tak:
Plik układu wygląda mniej więcej tak, a ważną częścią jest to, że Spinner i TextView mają tę samą szerokość, wysokość i marginesy:
Jestem pewien, że inne rozwiązania działają, gdy ignorujesz pierwsze wywołanie onItemSelected, ale naprawdę nie podoba mi się pomysł, że zawsze będzie wywoływany.
źródło