【问题标题】:Android - Dynamically change languageAndroid - 动态更改语言
【发布时间】:2015-07-15 04:01:53
【问题描述】:

在我的 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);
}

在清单中,我将这一行添加到我的 MainActivity:

android:configChanges="locale|orientation"

我也试过这个:

android:configChanges="locale|layoutDirection"

此解决方案效果很好,但一旦屏幕旋转就会恢复默认配置并恢复语言。

我该如何解决这个问题?

【问题讨论】:

标签: android locale dynamic-languages android-configchanges


【解决方案1】:

您可以在回调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");
}

【讨论】:

    【解决方案2】:

    您是否尝试过将您的语言环境存储在首选项中?例如:

    protected void onCreate(Bundle savedInstanceState) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        setLocale(prefs.getString("pref_locale", "en"));
    }
    
    public void changeLanguage(String lang) {
        prefs.setString("pref_locale", lang);
        setLocale(lang);
    }
    
    public void setLocale(String language_code) {
        Resources res = getResources();
        // Change locale settings in the app.
        DisplayMetrics dm = res.getDisplayMetrics();
        android.content.res.Configuration conf = res.getConfiguration();
        conf.locale = new Locale(language_code.toLowerCase());
        res.updateConfiguration(conf, dm);
    }
    

    【讨论】:

    • 嗨 Julia,我想知道 setLocale 函数中的代码是从哪里来的?这是自动生成的样板吗?还是来自 Android 指南/教程之类的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2019-10-15
    相关资源
    最近更新 更多