Android Spinner: в onItemSelected представление является нулевым - PullRequest
0 голосов
/ 08 июля 2019

У меня есть Spinner в моей деятельности, и я определяю OnItemSelectedListener в OnResume:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View view,
                                   int pos, long id) {
            final String newLanguage = iconAdapter.getItem(pos).name();
            Helper.getSettings(view.getContext()).setLocale(newLanguage);
            setLocale(new Locale(newLanguage));
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

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

1) Почему вообще вызывается onItemSelected, когда ни один пользователь не выбрал элемент? 2) почему дважды? 3) Почему вид во второй раз null?

Edit:

Так что этот код происходит ДО setOnItemSelectedListener:

spinner = findViewById(R.id.language_spinner);
    LanguageSpinnerAdapter iconAdapter = new LanguageSpinnerAdapter(this, Arrays.asList(LanguageIconEnum.values()));
    spinner.setAdapter(iconAdapter);
    String language = Helper.getSettings(this).getLocale();

    if(language == null){
        spinner.setSelection(0);
    } else {
        switch (language) {
            case "de":
                spinner.setSelection(1);
                break;
            case "fr":
                spinner.setSelection(2);
                break;
            default:
                spinner.setSelection(0);
        }
    }

"Правильно ли предположить, что два раза, когда вызывается OnItemSelected, это когда я устанавливаю адаптер и затем когда я вызываю .setSelection() вручную?" - Это не тот случай, если я удаляю ручную часть setSelection(), она все равно вызывается дважды.

Функция setLocale() вызывает recreate, которая снова заполняет spinner, так вот откуда приходит второй вызов OnItemSelected.

Так что же осталось:

1) Почему второй звонок view = null?

2) Что делать в бесконечном цикле?

1 Ответ

0 голосов
/ 08 июля 2019

Хорошо, вот ответы:

1) Почему вообще вызывается onItemSelected, когда ни один пользователь не выбрал элемент?

  • , как упомянуто @Blundell, когда спиннерзаполняется, элемент выбирается и поэтому вызывается OnItemSelected.

2) Почему дважды?

  • В OnItemSelectedsetLocale) я звонювоссоздать, что заполняет счетчик во второй раз.

3) Почему представление во второй раз нуль?

  • ??? I 'Я действительно любил ответ на этот вопрос.

Решение было:

if(lastPos != -1 && lastPos != pos){
   final String newLanguage = iconAdapter.getItem(pos).name();
   Helper.getSettings(view.getContext()).setLocale(newLanguage);
   setLocale(new Locale(newLanguage));
}
lastPos = pos;

Кто-нибудь знает ответ на вопрос 3?

...