У меня есть 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) Что делать в бесконечном цикле?