android 微调器:在 onItemSelected 视图中为空
android Spinner: in onItemSelected view is null
我的 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
}
});
现在,onItemSelected
在创建 activity 期间被调用 两次 - 用户没有选择任何内容。第一次一切正常,但第二次 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);
}
}
"Am I right to assume, the two times the OnItemSelected
is called, is when I set the adapter and then when I call .setSelection()
manually?" - 不是这样的,如果我删除手动 setSelection()
部分,它仍然被调用两次。
函数 setLocale()
调用 recreate
再次填充 spinner
,因此这是对 OnItemSelected
的第二次调用的来源。
所以还剩下什么:
1) 为什么第二次调用是view
= null
?
2) 如何应对无限循环?
好的,这里是答案:
1) 为什么 onItemSelected
在没有用户选择项目时被调用?
- 如@Blundell 所述,当微调器被填充时,一个项目被选中,因此
OnItemSelected
被调用。
2) 为什么是两次?
- 在
OnItemSelected
中(在 setLocale
中)我调用重新创建,它会第二次填充微调器。
3) 为什么视图第二次为null?
- ???
我真的很喜欢这个问题的答案。
解决方案是:
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 的答案吗?
我的 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
}
});
现在,onItemSelected
在创建 activity 期间被调用 两次 - 用户没有选择任何内容。第一次一切正常,但第二次 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);
}
}
"Am I right to assume, the two times the OnItemSelected
is called, is when I set the adapter and then when I call .setSelection()
manually?" - 不是这样的,如果我删除手动 setSelection()
部分,它仍然被调用两次。
函数 setLocale()
调用 recreate
再次填充 spinner
,因此这是对 OnItemSelected
的第二次调用的来源。
所以还剩下什么:
1) 为什么第二次调用是view
= null
?
2) 如何应对无限循环?
好的,这里是答案:
1) 为什么 onItemSelected
在没有用户选择项目时被调用?
- 如@Blundell 所述,当微调器被填充时,一个项目被选中,因此
OnItemSelected
被调用。
2) 为什么是两次?
- 在
OnItemSelected
中(在setLocale
中)我调用重新创建,它会第二次填充微调器。
3) 为什么视图第二次为null?
- ??? 我真的很喜欢这个问题的答案。
解决方案是:
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 的答案吗?