【问题标题】:Android programming: How to make language change permanent in onItemSelected adapter in a spinnerAndroid 编程:如何在微调器中的 onItemSelected 适配器中永久更改语言
【发布时间】:2021-10-03 16:17:08
【问题描述】:

我是 android 编程新手,我想做以下事情: 我有一个微调器,可以让你改变语言。我已经设置了它并且效果很好。然而问题是它不记得选择的语言(在微调器中)。因此,如果您要关闭应用程序并重新启动它,它将恢复到微调器上的第一个项目,即英文。 我想改变这个功能,一旦你选择了一个项目,它就会记住它。

我已经设置了一个共享偏好,它会记住选择了哪种语言。但是,我不能让共享偏好成为主导,从那时起我就永远无法更改选择的语言,如果我让选择的语言成为主导,那么即使在选择的语言实际上应该遵循的开始时,偏好也将始终遵循选择的语言偏好。这是我现在拥有的代码。我希望任何人都可以帮助我,因为我已经为此绞尽脑汁了一段时间

    pref_language = pref.getString("language",  "en");
    //pref_language_begin = pref.getBoolean("language_begin", false);

    final Spinner spinner_languages = (Spinner) findViewById(R.id.spinner_languages);
    spinner_languages.setAdapter(new CustomSpinnerAdapter(MainActivity.this, R.layout.customspinneritem, languages, language_flags));
    spinner_languages.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            parent.getItemAtPosition(position);
            language_chosen = (String) parent.getItemAtPosition(position);
            if (!pref_language.equals(language_chosen)) {
                SetLocale(language_chosen);
                pref_language = language_chosen;
                edit.putString("language", pref_language);
                //edit.putBoolean("language_begin", true);
                edit.apply();
                recreate();
            }
            else{
            }
        }

customspinneradapter 只是让我为它选择一种语言和一个标志。 我想我可能需要第二个偏好,但我不知道如何实现它。启动时的主要语言应该是首选,但在微调器中选择一种语言后应该是选择的语言。我正在考虑使用 onclick 侦听器,但我不确定是否应该使用微调器。

肯定有更简单的方法,我只是想不通。 希望大家帮帮我!

【问题讨论】:

    标签: java android


    【解决方案1】:

    我会给你几个建议..

    1. 使用“cammel case”技术命名您的变量。例如: spinner_languages 应该被命名为 spinnerLanguages 。成为专业人士:)

    2. 在共享首选项中为语言创建一个键作为全局和常量变量,以便在一个或多个类中的任何地方使用它并防止拼写错误(如果您不知道什么是“全局变量”,请谷歌它):

      静态最终字符串 LANGUAGES_KEY = "语言";

    3. 就在您开始活动时( onCreate() 方法但在 super.onCreate(savedInstanceState); 之前)读取您的共享首选项并为应用设置语言:

      //安卓系统语言

      String langSystem = Locale.getDefault().getLanguage();

      String lang = sharedPreferences.getString(LANGUAGES_KEY, langSystem);

      //更新语言

      SetLocale(lang);

    4. 之后为微调器找到正确的语言索引(例如通过使用 for 循环) 并使用: spinnerLanguages.setSelection(languageIndex)

    【讨论】:

    • 你的回答解决了我的问题!我应该在 super.onCreate 之前或可能在 setContentView 之前使用 SetLocale。无论如何,在打开/创建 MainActivity 之前更改语言可确保更改语言并且您不需要重新创建它。感谢您和@snachmsm 的选择循环,我的问题现在实际上已解决。
    【解决方案2】:

    设置适配器后只需使用setSelection方法进行初始选择项(位置必须小于列表项计数,没有适配器设置微调器有0个项目)

    spinner_languages.setSelection(position);
    

    position 可以被选中,例如通过迭代 languages 数组(传递给适配器)并将每个语言与 pref_language 进行比较

    int position = -1;
    for(int i=0; i < languages.size(); i++) {
        if(pref_language.equals(languages.get(i))){
            position = i;
            break;
        }
    }
    if (position >=0) { // found
        spinner_languages.setSelection(position);
    }
    

    查看THIS关于微调器选择的主题

    【讨论】:

    • 感谢您的回答,但我之前尝试过。这让我陷入了这样一个问题,如果我这样做,MainActivity 将不会更新,因为要更新它需要重新创建它,并且它不会到达那个点,因为 language_chosen 等于 pref_language。当 language_chosen 等于 pref_language 时,我无法确定要做什么,因为它总是会执行,因为它是一个 onItemSelected 侦听器,并且使用 recreate() 会导致 MainActivities 的垃圾邮件。所以这个答案本身对我没有帮助
    • 编辑:我太仓促了。您的回答结合@Andrij 的回答解决了我的问题。您的循环在我的 oncreate 方法结束时进行,以便正确选择 language_chosen。 Andrij 指出,如果我在 super.onCreate 之前使用 SetLocale,主菜单的语言将在调用之前更改,因此不需要重新创建。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多