Android-动态更改语言

Android-动态更改语言,android,locale,dynamic-languages,android-configchanges,Android,Locale,Dynamic Languages,Android Configchanges,在我的Android应用程序中,我想以友好的方式更改默认语言。我已经实现了这个方法: public void changeLanguage(String lang) { //lang="it" or "en" for example myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configurat

在我的Android应用程序中,我想以友好的方式更改默认语言。我已经实现了这个方法:

public void changeLanguage(String lang) {  //lang="it" or "en" for example
    myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
            {
                finish();
                startActivity(getIntent());
            } else recreate();
        }
    }, 1);
}
我也试过:

android:configChanges="locale|layoutDirection"
此解决方案运行良好,但只要屏幕旋转,就会返回默认配置并恢复语言


如何解决此问题?

您可以在回调
onSaveInstanceState
中保存语言配置,当系统因旋转而重新创建活动时,重新加载保存的区域设置值

private static final String LANG = "lang";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        Configuration configuration = getResources().getConfiguration();
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        configuration.locale = new Locale(savedInstanceState.getString(LANG));
        getResources().updateConfiguration(configuration, displayMetrics);
    }
}

/*
 * (non-Javadoc)
 * 
 * @see
 * android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os
 * .Bundle)
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putString(LANG, "it");
}

您是否尝试过在首选项中存储区域设置?例如:

创建时受保护的void(Bundle savedInstanceState){
SharedPreferences=PreferenceManager.getDefaultSharedPreferences(此);
setLocale(prefs.getString(“pref_locale”、“en”);
}
公共语言(字符串语言){
prefs.setString(“pref_locale”,lang);
语言环境;
}
公共void setLocale(字符串语言\u代码){
Resources res=getResources();
//更改应用程序中的区域设置。
DisplayMetrics dm=res.getDisplayMetrics();
android.content.res.Configuration=res.getConfiguration();
conf.locale=newlocale(language_code.toLowerCase());
res.updateConfiguration(conf,dm);
}

我已经尝试了他们在那篇文章中提供的解决方案,但正如我在上面所说的,它不起作用。嗨,Julia,我想知道,
setLocale
函数中的代码来自哪里?这是自动生成的样板文件吗?还是来自Android指南/教程或其他什么?
private static final String LANG = "lang";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        Configuration configuration = getResources().getConfiguration();
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        configuration.locale = new Locale(savedInstanceState.getString(LANG));
        getResources().updateConfiguration(configuration, displayMetrics);
    }
}

/*
 * (non-Javadoc)
 * 
 * @see
 * android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os
 * .Bundle)
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putString(LANG, "it");
}