13

我创建了一个双语(有两种语言)android 应用程序。我在两个文件中插入了我的资源字符串:

For Persian language (default)
values/strings_locale.xml‬

For English language 
values-en/strings_locale.xml‬

我第一次启动 Activity 我插入了以下代码:

Configuration c = new Configuration(this.getResources().getConfiguration());
c.locale = new Locale("fa_IR");

this.getResources().updateConfiguration(c, this.getResources().getDisplayMetrics());

因此,在此代码之后,我的默认语言将是波斯语,并且所有活动中的所有字符串都以波斯语正确显示。

但是问题是当设备的屏幕旋转时,所有的字符串都以英文显示,并且所有其他活动也会发生这种情况!我必须关闭并重新打开我的应用程序。

为什么会发生这种情况,我该如何解决这个问题?

4

3 回答 3

27

您可以制作扩展类Application。在那里,您可以覆盖每次更改配置时都会调用的一种方法(例如更改屏幕方向时)。

就像是:

public class MyApplication extends Application {
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale();
    }

    private void setLocale() {
        Locale locale = new Locale("fa_IR");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config,
              getBaseContext().getResources().getDisplayMetrics());
    }
}

并且不要忘记在清单中声明它:Application 类的示例

在 AndroidManifest.xml 中:

<application
    android:name="com.blaablaa.bumbam.MyApplication"
    ...
于 2013-11-04T10:41:17.767 回答
0

我不完全明白你想要做什么。但一般来说,您不必管理应用程序的语言。如果可用,Android 将自动选择手机语言,并且在任何其他情况下会弹出一个对话框来选择语言。

如果您确实想使用代码设置独立于语言的语言(我不建议这样做),那么您的生命周期可能存在问题,阻止您的代码在方向更改后再次运行。如果您发布更多代码,我可以帮助您。

于 2013-11-04T10:36:49.677 回答
0

您可以创建自定义ContextWrapper

public class mContextWrapper extends ContextWrapper {
    public mContextWrapper(Context base){
        super(base);
    }

    @SuppressWarnings("deprecation")
    public static ContextWrapper wrap(Context context, String language) {
        Configuration config = context.getResources().getConfiguration();
        Locale sysLocale = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            sysLocale = getSystemLocale(config);
        } else {
            sysLocale = getSystemLocaleLegacy(config);
        }
        if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                setSystemLocale(config, locale);
            } else {
                setSystemLocaleLegacy(config, locale);
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                context = context.createConfigurationContext(config);
            } else {
                context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
            }
        }
        return new mContextWrapper(context);
    }

    @SuppressWarnings("deprecation")
    public static Locale getSystemLocaleLegacy(Configuration config){
        return config.locale;
    }

    @TargetApi(Build.VERSION_CODES.N)
    public static Locale getSystemLocale(Configuration config){
        return config.getLocales().get(0);
    }

    @SuppressWarnings("deprecation")
    public static void setSystemLocaleLegacy(Configuration config, Locale locale){
        config.locale = locale;
    }

    @TargetApi(Build.VERSION_CODES.N)
    public static void setSystemLocale(Configuration config, Locale locale){
        config.setLocale(locale);
    }
}

并在您的活动attachBaseContext附加您的自定义ContextWrapper

 @Override
    protected void attachBaseContext(Context newBase) {
        globalClass = (YouAppClass)newBase.getApplicationContext();
        //try geting the lang you have setted inside your YouAppClass class
        // or you can use shared preferences for it 
        //pref = PreferenceManager.getDefaultSharedPreferences(newBase)
        lang=globalClass .getLang();
        super.attachBaseContext(mContextWrapper.wrap(newBase,lang));
    }
于 2017-10-11T08:20:30.047 回答