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 期间被调用 两次 - 用户没有选择任何内容。第一次一切正常,但第二次 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);
        }
    }

"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 的答案吗?