Android Spinner: получить событие изменения выбранного элемента
Как вы можете установить прослушиватель событий для счетчика при изменении выбранного элемента?
в основном то, что я пытаюсь сделать, это что-то вроде этого:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
14 ответов:
некоторые из предыдущих ответов неверны. Они работают для других виджетов и представлений, но документация для Spinner widget четко указано:
счетчик не поддерживает щелчок элемента события. Вызов этого метода приведет к повышению исключение.
лучше использовать 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 } });это работает для меня.
обратите внимание, что onItemSelected метод также вызывается когда представление строится, так что вы можете рассмотреть вопрос о помещении его внутрь
onCreate()вызов метода.
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; } });Примечание: запомни одну вещь.
Spinner
OnItemSelectedListenerсобытие будет выполняться дважды:
- Spinner инициализация
- пользователь выбрал вручную
попробуйте дифференцировать эти два с помощью переменной-флага.
вы можете реализовать
AdapterView.OnItemSelectedListenerкласс В вашей деятельности.а затем использовать нижеприведенную строку внутри
onCreate()Spinner spin = (Spinner) findViewById(R.id.spinner); spin.setOnItemSelectedListener(this);затем переопределите эти два метода:
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
вы можете избежать вызова OnItemSelectedListener () с помощью простой проверки: сохраните текущий индекс выбора в целочисленной переменной и проверьте в onItemSelected(..) прежде чем делать что-либо.
например:
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; } });и
iCurrentSelectionдолжен быть в области объекта для этого, чтобы работать!
в документах для spinner-widget говорится: "spinner не поддерживает события щелчка элемента." Вы должны использовать "setOnItemSelectedListener" для решения вашей проблемы
spinner1.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { //add some code here } );
найдите свое имя spinner и найдите id, а затем реализуйте этот метод.
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 } });
возьмите глобальную переменную для текущего выбора 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>
неважно, будете ли вы устанавливать OnItemSelectedListener в onCreate или onStart - он все равно будет вызываться во время создания или запуска активности (соответственно).
Поэтому мы можем установить его в onCreate (а не в onStart!).
Просто добавьте флаг, чтобы выяснить первую инициализацию:private Spinner mSpinner; private boolean mSpinnerInitialized;затем в onCreate (или onCreateView) просто:
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; } });
Если вы хотите true onChangedListener (). Сохраните начальное значение в обработчике и проверьте, изменилось ли оно. Это просто и делает не требуется глобальная переменная. Если у вас есть более одной блесны на странице.
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; } }объекты - это ваш друг, используйте их.
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 } );
блестящая выше Стефан автомобиль можно оставить также мне очень помогли. Спасибо. Я новичок, и"@Override "в нем вызвал ошибку О"должен переопределить метод суперкласса с тем же именем". Eclipse предложил мне удалить переопределения. Когда я это сделал, это сработало. Пожалуйста, не спрашивайте меня, как и почему.
лучший способ, который я думаю, будет иметь flagitemselected=0; в oncreate. И на выбранном событии элемента увеличьте этот флаг, т. е. flagitemselected++; а затем проверьте, если(flagitemselected!=1){// делать свою работу здесь}.Это поможет я думаю
один трюк, который я нашел, был помещен ваш setOnItemSelectedListeners в onWindowFocusChanged вместо onCreate. Я не нашел никаких плохих побочных эффектов, чтобы сделать это таким образом, пока. В основном, настроить слушателей после того, как окно будет нарисовано. Я не уверен, как часто onwindowfocuschanged работает, но достаточно легко создать себе переменную блокировки, если вы обнаружите, что она работает слишком часто.
Я думаю, что Android может использовать систему обработки сообщений на основе, и если вы поместите все это в onCreate, вы можете столкнуться с ситуациями, когда счетчик заполняется после того, как он будет нарисован. Таким образом, ваш слушатель будет срабатывать после установки местоположения элемента. Это, конечно, обоснованная догадка, но не стесняйтесь поправлять меня на этом.
Comments