【发布时间】:2019-11-17 10:59:55
【问题描述】:
我的活动中有一个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
}
});
现在,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) 遇到无限循环怎么办?
【问题讨论】:
-
我看不到你的其余代码,但是当你在微调器上设置一些数据时,它至少被调用一次,因为当数据第一次放入时,一个项目被“选中”。显示如何填充微调器的代码
标签: android spinner onitemselectedlistener