为啥 Spinner 中的第一项不起作用

Posted

技术标签:

【中文标题】为啥 Spinner 中的第一项不起作用【英文标题】:Why is the first item in the Spinner not working为什么 Spinner 中的第一项不起作用 【发布时间】:2019-12-31 08:53:58 【问题描述】:

我希望微调器从以下 3 个国家/地区中进行选择,但我只能访问第二个和第三个选项。当我选择第一个选项时,微调器不起作用。

 String[] countries =  "INDIA","AUSTRALIA","ENGLAND";


 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int position, long id) 

            if (!mSpinnerInitialized) 
                mSpinnerInitialized = true;
                return;
            
            if(spinner.getSelectedItem().toString().equals("INDIA"))
                LocaleManager.setNewLocale(LoginActivity.this, "en");
                restart();

            else if(spinner.getSelectedItem().toString().equals("AUSTRALIA"))
                LocaleManager.setNewLocale(LoginActivity.this, "si");
                restart();

            else if(spinner.getSelectedItem().toString().equals("ENGLAND"))
                LocaleManager.setNewLocale(LoginActivity.this, "ta");
                restart();
            
            Toast.makeText(LoginActivity.this, spinner.getSelectedItem().toString(), Toast.LENGTH_LONG).show();
        

微调器初始化

ArrayAdapter aa = new ArrayAdapter(this,R.layout.languagespinner,countries);
    aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(aa);

应该可以访问名为 INDIA 的微调器文本,但不幸的是我无法访问。

编辑

这可能是因为 mSpinnerInitialized 但如果我删除它,活动将在无限循环中重新启动

【问题讨论】:

检查,如果 (spinner.getSelectedItem().toString.equals("INDIA") 为真,通过使用 System.out 或 toast 或日志。也许你错过了什么。你能告诉我们微调器的 xml 以及如何用值填充它? 使用 android 调试器并停止第一个 if 并检查您的值 当我按下微调器的第一项时,它不会进入 onselected 方法 如果条件有效,则第二个和第三个 你能告诉我们 Spinner 初始化吗? 【参考方案1】:

将您的代码更改为:

private String[] arraySpinner;

onCreate 中这样做:

this.arraySpinner = new String[]"INDIA", "AUSTRALIA", "ENGLAND";

Spinner yourSpinner = findViewById(R.id.yourSpinnerID);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arraySpinner);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
yourSpinner.setAdapter(adapter);


yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
      @Override
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        String selectedItem = parent.getItemAtPosition(position).toString();

        if(selectedItem.equals("INDIA"))
            // DO YOUR LOGIC
        
    

要更改您的语言,请使用以下代码:

public class LocaleHelper 

    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static void onCreate(Context context) 

        String lang;
        if(getLanguage(context).isEmpty())
            lang = getPersistedData(context, Locale.getDefault().getLanguage());
        else 
            lang = getLanguage(context);
        

        setLocale(context, lang);
    

    public static void onCreate(Context context, String defaultLanguage) 
        String lang = getPersistedData(context, defaultLanguage);
        setLocale(context, lang);
    

    public static String getLanguage(Context context) 
        return getPersistedData(context, Locale.getDefault().getLanguage());
    

    public static void setLocale(Context context, String language) 
        persist(context, language);
        updateResources(context, language);
    

    private static String getPersistedData(Context context, String defaultLanguage) 
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    

    private static void persist(Context context, String language) 
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    

    private static void updateResources(Context context, String language) 
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());


    

并在您的 Spinner 类中使用此方法更改语言:

LocaleHelper.setLocale(this,"en") //for english;
LocaleHelper.setLocale(this, "de") // for german

并且对于重新启动使用此方法:

public static void restartActivity(Activity activity)
    if (Build.VERSION.SDK_INT >= 11) 
        activity.recreate();
     else 
        activity.finish();
        activity.startActivity(activity.getIntent());
    

【讨论】:

同样的结果。点击 AUSTRALIA 和 ENGLAND 有效,但点击 INDIA 甚至没有进入 onItemSelected 方法 我测试过,它对我有用。再次清理并重建您的项目。 问题是重启方式。它确实有效。但是,由于在创建活动期间的默认值是 INDIA,因此活动会不断重启 删除所有内容并尝试我的代码,它会起作用。暂时不要使用restart,只是测试我的代码。 是的,它确实有效,哈哈。但我需要重新启动活动。这就是为什么我发现很难找到解决方案

以上是关于为啥 Spinner 中的第一项不起作用的主要内容,如果未能解决你的问题,请参考以下文章