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 在创建活动期间被调用两次 - 无需用户选择任何内容。第一次一切都按预期工作,但第二次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】:

好的,答案在这里:

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

【讨论】:

能否请您发布错误日志以检查NullPointerException 被抛出的位置? Helper.getSettings(view.getContext()).setLocale(newLanguage); viewnull @ view.getContext()

以上是关于android Spinner:在 onItemSelected 视图中为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中自定义 Spinner

Android控件之Spinner简单使用

Android-spinner

Android/Spinner:删除箭头右侧的填充

在 Android 中为 Spinner 创建文本过滤器(如快速搜索)

android spinner怎么用