来自资源的Android本地化

来自资源的Android本地化,android,string,localization,resources,Android,String,Localization,Resources,我目前正在尝试本地化我的android应用程序,我已经设置好了所有内容,但每当我尝试更改语言时,它总是加载相同的字符串资源 我有以下字符串资源 values values-am values-om SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); String languageLocale = sharedPreferences.getString("SAVED

我目前正在尝试本地化我的android应用程序,我已经设置好了所有内容,但每当我尝试更改语言时,它总是加载相同的字符串资源

我有以下字符串资源

values
values-am
values-om

SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
String languageLocale = sharedPreferences.getString("SAVED_LANGUAGE_LOCALE", "am");

    Log.d(TAG,languageLocale);

    String languageToLoad  = languageLocale; // your language
    Locale locale = new Locale(languageToLoad);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());
我还使用下面的代码在不同的活动中选择语言

RadioGroup.OnCheckedChangeListener radioGroupOnCheckedChangeListener =
        new RadioGroup.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {

                RadioButton checkedRadioButton = (RadioButton)mRadioGroup.findViewById(checkedId);
                int checkedIndex = mRadioGroup.indexOfChild(checkedRadioButton);
                //AppController languageSetting = (AppController)getApplication();
                SavePreferences(KEY_SAVED_RADIO_BUTTON_INDEX, checkedIndex);
                mLanguageId = checkedIndex + 1;
                languageSetting.setLanguageId(mLanguageId);
                switch (mLanguageId){
                    case 1:
                        SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"en");
                        mTest = "en";
                        break;
                    case 2:
                        SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"am");
                        mTest = "am";
                        break;
                    case 3:
                        SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"om");
                        mTest = "om";
                        break;
                }

            }};

现在的问题是,每当应用程序第一次启动时,它都会加载正确的字符串资源,但当我更改语言时,它会保留相同的字符串资源。这意味着,例如,当我将应用程序更改为值om时,如果应用程序以值am字符串资源启动,我仍然可以看到值am字符串,尽管已为区域设置分配了正确的值(“om”)

您需要在
onCheckedChanged()
中的每个语言选择上调用以下代码

设置区域设置后,使用
重新创建()
重新启动活动。

以下是一些内容:

String languageLocale = sharedPreferences.getString("SAVED_LANGUAGE_LOCALE", "am");
借**

getString(““保存的语言环境”、“am”)

**你不需要字符串“am”。这个“am”你只需要。putString()

应该像

  String languageLocale = sharedPreferences.getString("KEY_SAVED_LANGUAGE_LOCALE");

意图刷新和调用

Locale locale = new Locale("ar"); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

this.setContentView(R.layout.activity_main_category_page);

“保留相同的字符串资源”-您的意思是它没有将视图中的当前值更新为本地化的值?@aelimill是的,这就是我的意思。您需要手动更新所有需要的视图或调用recreate()在活动中。遗憾的是,这是我知道的使其自动工作的唯一方法。我尝试过,但仍然没有成功。下面是我所做的更改。我通过清除缓存并终止应用程序的进程来解决问题。换句话说,我必须再次手动启动应用程序。我觉得我的解决方案并不完美,我认为仍然存在问题一种更好的方法。我用它来访问我在共享首选项中保存的内容。我用Log.d(标记,languageLocale)对它进行了测试,它正好提供了我所需要的内容。字符串“am”只是一个默认值,其中是putString()?如果你在我的第一篇文章中看到函数SavePreferencesLocale()名为
private void savepreferences缩放(字符串键,字符串值){SharedReferences SharedReferences=GetSharedReferences(“MY_SHARED_PREF”,MODE_private”);SharedReferences.Editor=SharedReferences.edit();Editor.putString(键,值);Editor.commit()}
Locale locale = new Locale("ar"); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

this.setContentView(R.layout.activity_main_category_page);