我的活动中有一个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
?
编辑:
因此,此代码在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)如何做阿甘斯特无限循环?
答案 0 :(得分:0)
好,这是答案:
1)当没有用户选择某项时,为什么onItemSelected
会被调用?
OnItemSelected
。2)为什么要两次?
OnItemSelected
中(在setLocale
中,我称为recreate,它再次填充了微调框。3)为什么第二次查看为空?
解决方案是:
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的答案吗?