Android Spinner - onItemSelected/setOnItemSelectedListener не запускается

Это сводит меня с ума, так как я делал это раньше, но не могу понять, почему это не работает сейчас...

У меня есть кнопка меню, реализованная обычным образом через файл menu.xml и метод onOptionsItemSelected с переключателем в нем, который создает и отображает счетчик.

Я добавил setOnItemSelectedListener, но он никогда не срабатывает. Появляется счетчик, я выбираю вариант или отступаю, ни onItemSelected, ни onNothingSelected не вызываются.

Вот весь код между «case» и «return true» в операторе switch, обрабатывающем кнопку меню. (topThis — это переменная, относящаяся к контексту активности — отлично работает для всех других тостов в приложении)

String[] widgetModes = {"Mode 1", "Mode2"};
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes);
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner widgetModeSpinner = new Spinner(this);
widgetModeSpinner.setAdapter(widgetModeAdapter);
widgetModeSpinner.setPrompt("Choose Widget Mode");

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) 
    {
        Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show();
    }
});

widgetModeSpinner.performClick();

Любые идеи? Я смутно подозреваю, что проблема в том, что я программно создаю Spinner...


person Greg    schedule 07.02.2011    source источник
comment
возможно, попробуйте parentView.getContext()? Вам не нужно добавлять его куда-то в UI? - это может означать, что события взаимодействия с пользовательским интерфейсом, такие как выбор элемента, не передаются счетчику.   -  person Jems    schedule 07.02.2011
comment
Спасибо за совет - в итоге реализовал что-то в этом роде. Добавил в макет невидимый счетчик, переместил все, кроме PerformClick, из метода меню в метод, вызываемый в onCreate. Кажется, гарантирует, что слушатель привязан к текущему раздутому макету или что-то в этом роде. Позиция кода относительно setContentView(R.layout.main); является важным...   -  person Greg    schedule 08.02.2011
comment
Я думаю, что тот факт, что остальная часть моего кода включает время от времени повторное расширение макета (с использованием setContentView(R.layout.main);), также вызывает проблемы... слушатели больше не подключаются, если не установлены снова после повторного заполнения макета.   -  person Greg    schedule 08.02.2011
comment
Вы должны попробовать с простым журналом. я(тэг, сообщение) ; вместо Toast, чтобы подтвердить, что это не ваш контекст topThis, вызывающий это?   -  person TouchBoarder    schedule 05.10.2012
comment
Вы определяете onItemSelectedListener, но вызываете синтетический PerformClick().... Может быть, вместо этого вам следует переопределить onItemClicked()?   -  person Shark    schedule 07.12.2012
comment
@Shark нет onItemClickListener для Spinners.   -  person A Person    schedule 13.04.2013
comment
@Siidheesh onItemSelected() в этом случае...   -  person Shark    schedule 15.04.2013
comment
Ваш комментарий о перераспределении макета помог мне в случае, когда я пытался добавить счетчики к элементам ListView, которые продолжают перерисовываться. Я перешел на PopupMenus, который оказался намного проще.   -  person arlomedia    schedule 20.08.2014
comment
PerformClick, вероятно, вызывает проблему. Он возвращает первый элемент, а после выбора элемента возвращает InputEventReceiver: Попытка завершить событие ввода, но приемник события ввода уже удален. Работу пока не нашел.   -  person LadyWoodi    schedule 11.03.2016
comment
Временное решение: мне пришлось добавить счетчик в xml (не забудьте android:spinnerMode="dialog", и вы можете установить 0 параметров размера) и изменить = новый счетчик (это); на `= (Spinner) findViewById(R.id.dialog_spinner);`   -  person LadyWoodi    schedule 11.03.2016


Ответы (4)


У меня была аналогичная проблема, когда я реализовывал счетчик, я решил ее, получив родительский вид и установив адаптер-

spinner1 =(Spinner)findViewById(R.id.spinner1);
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,""));
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{
protected Adapter initializedAdapter=null;
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        if(initializedAdapter !=parentView.getAdapter() ) {
            initializedAdapter = parentView.getAdapter();
           return;
        }

        String selected = parentView.getItemAtPosition(position).toString();

        if(abc.equals("Select") && !selected.equals("Select"))
        {
            do something
        }

        else 
        {
            Do something
        }
        textQualification=selected;
        SearchUpdated("Qualification");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});
person JNI_OnLoad    schedule 25.01.2013

Помните, что вы не можете повторно выбрать один и тот же элемент счетчика, он всегда устанавливает первый элемент как выбранный, если вы не добавляете какой-либо пользовательский код для обработки выбора счетчика.

Чтобы Toast не отображался, я бы предложил всегда использовать «MyActivity.this» в качестве контекста при создании Toast внутри интерфейса прослушивателя, например:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        /**
         * Called when a new item is selected (in the Spinner)
         */
         public void onItemSelected(AdapterView<?> parent, View view, 
                    int pos, long id) {
                // An spinnerItem was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)

                Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show();

            }

            public void onNothingSelected(AdapterView<?> parent) {
                // Do nothing, just another required interface callback
            }

    }); // (optional)

А .show() в конце иногда легко забыть;)

person TouchBoarder    schedule 06.10.2012

На самом деле, если для вашего счетчика видимости установлено значение gone, тогда он будет вызывать щелчок по нему при вызове метода performclick(), но не будет запускать его setOnItemSelectedListener< /strong> поэтому вам нужно изменить видимость, тогда это сработает

person Mehroz Munir    schedule 08.03.2016

Я знаю, что вопрос немного устарел, но если вы ожидаете обратного вызова AsyncTask, убедитесь, что вы сообщили адаптеру об изменениях данных, вызвав notifyDataSetChanged() в потоке обратного вызова!

@Override
public void onPostExecute(String result) {
   ///do something with your data  
   spinnerArrayAdapter.notifyDataSetChanged();
}
person Community    schedule 15.09.2013
comment
Спасибо. 2 часа копался :) - person Jonas Liljestrand; 04.01.2015