Android Spinner:在onItemSelected视图中为空

e3bfsja2  于 2023-04-28  发布在  Android
关注(0)|答案(2)|浏览(130)

我在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

        }
    });

现在,在创建Activity的过程中,onItemSelected被调用两次,而用户没有选择任何内容。第一次一切正常,但第二次viewnull,并抛出NullPointerException
1.当没有用户选择一个项目时,为什么要调用onItemSelected
1.为什么两次?
1.为什么第二次视图是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
1.面对无限循环该怎么办?

yeotifhr

yeotifhr1#

好了,答案如下:
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;

有谁知道第三题的答案?

tyky79it

tyky79it2#

尝试在视图创建后延迟调用spinner.setAdapter(adapter);

void initAdapter() {
   ArrayAdapter<String> adapter = new ArrayAdapter<>( ... );
   spinner.setAdapter(adapter);
   spinner.setSelection(0);
}

void onCreate(...) or onViewCreated( ... ) {
   * * *

    new Handler(Looper.getMainLooper()).postDelayed(() -> initAdapter(), 200);
}

相关问题