我在Activity中有一个Spinner
,并在OnResume
中定义了一个OnItemSelectedListener
:
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
}
});
现在,在创建Activity的过程中,onItemSelected
被调用两次,而用户没有选择任何内容。第一次一切正常,但第二次view
是null
,并抛出NullPointerException
。
1.当没有用户选择一个项目时,为什么要调用onItemSelected
?
1.为什么两次?
1.为什么第二次视图是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
?
1.面对无限循环该怎么办?
2条答案
按热度按时间yeotifhr1#
好了,答案如下:
1)当没有用户选择一个项目时,为什么要调用
onItemSelected
?OnItemSelected
被调用。2)为什么是两次?
OnItemSelected
中(在setLocale
中),我调用了recreate,它将第二次填充微调器。3)为什么视图第二次为空?
解决方案为:
有谁知道第三题的答案?
tyky79it2#
尝试在视图创建后延迟调用
spinner.setAdapter(adapter);
。