为啥 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 中的第一项不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 sbt 项目依赖项不起作用? (坚持尝试远程获取它)

放心 IntelliJ IDEA 中的 3.0.3 maven 依赖项不起作用

安装失败后,设备管理器中的“扫描硬件更改”等效项不起作用

将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用

为啥 ul 列表中的第一个类型不起作用

Qt for Android - startActivityForResult 等效项不起作用