【问题标题】:After the screen rotation, the language of my application will be changed屏幕旋转后,我的应用程序的语言将被更改
【发布时间】:2013-11-14 22:36:36
【问题描述】:

我创建了一个双语(有两种语言)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());

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

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

为什么会发生这种情况以及如何解决这个问题?

【问题讨论】:

  • 检查this documentation,当activity在旋转后重新创建时,你上面的代码可能不会再次运行...确保将代码放在可能再次处理之后的位置旋转。

标签: android localization internationalization rotation screen


【解决方案1】:

您可以创建扩展 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());
    }
}

别忘了在清单中声明:example of Application class

在 AndroidManifest.xml 中:

<application
    android:name="com.blaablaa.bumbam.MyApplication"
    ...

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有可能。如果您将我提到的代码放在您的第一个活动中,您的所有活动都将以该语言显示。你可以测试一下。我的问题是当我在第三个 Activity 中旋转设备时,我的应用程序的整个 Activity 的语言都更改为英语。
    • 我知道这是可能的。我只是说你不应该这样做。但是,如果您仍然希望我提供帮助,那么您需要发布更多代码。
    【解决方案3】:

    您可以创建自定义 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));
        }
    

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多