Android Spinner: Получить выбранное событие изменения элемента

Как вы можете установить прослушиватель событий для счетчика при выборе выбранного элемента?

В основном то, что я пытаюсь сделать, это нечто похожее на это:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
+377
источник поделиться
15 ответов

Некоторые из предыдущих ответов неверны. Они работают для других виджетов и видов, но в документации для Spinner widget четко указано:

Счетчик не поддерживает элемент click Мероприятия. Вызов этого метода повысит исключение.

Лучше использовать 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().

+778
источник
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
  • Пользователь выбран вручную

Попробуйте дифференцировать эти два с помощью переменной флага.

+51
источник
другие ответы

Связанные вопросы


Похожие вопросы

В своей деятельности вы можете реализовать класс 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("");
}
+17
источник

fooobar.com/questions/24550/...

Вы можете избежать вызова 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 должен быть в области объекта, чтобы это работало!

+15
источник

Найдите свое имя 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
    }
});
+8
источник

Документы для спиннер-виджет говорит

Спиннер не поддерживает события щелчка предмета.

Вы должны использовать setOnItemSelectedListener для решения вашей проблемы.

+7
источник

Не имеет значения, вы установите 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;
            }
        });
+6
источник
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);
+5
источник

Если вам нужен 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; 
        }
    }

Объекты - ваш друг, используйте их.

+4
источник
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
            }
        );
+3
источник

возьмите глобальную переменную для текущего выбора счетчика:

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>
+3
источник

Блестящее выступление Стефана Кламппа также очень помогло мне. Спасибо. Я новичок, а "@Override" в нем вызвал ошибку "должен переопределить метод Super class с тем же именем". Eclipse предложил мне удалить переопределения. Когда я это сделал, это сработало. Пожалуйста, не спрашивайте меня, как и почему.

+1
источник

Лучший способ, который я думаю, это иметь flagitemselected = 0; в onCreate(). И на выбранном элементе увеличивается значение этого флага, т. flagitemselected++; а затем проверьте

if(flagitemselected!=1)
{
// do your work here
}

Это поможет, я думаю.

+1
источник

Это будет работать инициализировать спиннер и findviewbyid и использовать это будет работать

    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
        }

    });
+1
источник

Один трюк, который я нашел, заключался в том, что ваш setOnItemSelectedListeners был включен в onWindowFocusChanged вместо onCreate. Я пока не нашел никаких плохих побочных эффектов для этого. В принципе, настройте слушателей после того, как окно будет нарисовано. Я не уверен, как часто работает onWindowFocusChanged, но достаточно легко создать себе блокирующую переменную, если вы обнаружите, что она работает слишком часто.

Я думаю, что Android может использовать систему обработки сообщений, и если вы поместите ее все в onCreate, вы можете столкнуться с ситуациями, когда счетчик заполняется после того, как он нарисован. Таким образом, ваш слушатель погаснет после того, как вы установили местоположение элемента. Разумеется, это обоснованная догадка, но не стесняйтесь исправить меня по этому поводу.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос