android Spinner:在 onItemSelected 视图中为空
Posted
技术标签:
【中文标题】android Spinner:在 onItemSelected 视图中为空【英文标题】:android Spinner: in onItemSelected view is null 【发布时间】: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) 遇到无限循环怎么办?
【问题讨论】:
我看不到你的其余代码,但是当你在微调器上设置一些数据时,它至少被调用一次,因为当数据第一次放入时,一个项目被“选中”。显示如何填充微调器的代码 【参考方案1】:好的,答案在这里:
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的答案吗?
【讨论】:
能否请您发布错误日志以检查NullPointerException
被抛出的位置?
Helper.getSettings(view.getContext()).setLocale(newLanguage);
view
是 null
@ view.getContext()
以上是关于android Spinner:在 onItemSelected 视图中为空的主要内容,如果未能解决你的问题,请参考以下文章