android Spinner:在onItemSelected视图中为null

时间:2019-07-07 21:32:33

标签: android spinner onitemselectedlistener

我的活动中有一个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在创建活动期间被称为两次-用户无需选择任何内容。第一次一切都按预期运行,但是第二次viewnull并抛出了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 个答案:

答案 0 :(得分:0)

好,这是答案:

1)当没有用户选择某项时,为什么onItemSelected会被调用?

  • 就像@Blundell提到的那样,在填充微调器时,将选择一个项目,因此将调用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的答案吗?