Android 轮换后语言发生变化

Android language changes after rotation

安装我的应用程序时,首先运行它要求用户选择语言;但是如果用户第二次启动应用程序,语言会自动设置(为之前选择的语言)。

问题是,首先 运行 当用户选择语言时,应用程序仍然是英语(无论用户选择什么语言),但是如果我旋转设备,语言就会更改为正确的语言(以选了一个)。第二个应用程序出现同样的问题 运行;应用程序以英文启动,但在旋转后语言更改为正确的语言。

有什么建议吗?提前谢谢你

这里是我更改语言的 MainActivity 中的代码:

private void initApp() {
        if (Settings.getLanguage().equals("")){ 
            String[] items = { getResources().getString(R.string.lang_eng), getResources().getString(R.string.lang_geo)};
            showDialogSingleChoise(items, getResources().getString(R.string.select_language_title), 0, false, false, this.languageSelectedListener, this.languageConfirmedListener, null);
        } else {        
            System.out.println("initApp: " + Settings.getLanguage());

            Settings.setLanguage(MainActivity.this.getResources(), Settings.getLanguage());
            appVersionCheck();
        }
    }

private OnClickListener languageConfirmedListener = new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        Settings.setLanguage(MainActivity.this.getResources(), MainActivity.this.language);
        appVersionCheck();
    }
};

这里是来自设置的代码片段:

public static void setLanguage(Resources res, String langString){
        System.out.println("lang in pref: " + langString);
        setStringProperty(PREFS_LANG ,langString);
        MainApp.getInstance().setLocale(res);
    }

这是我的申请 class:

public class MainApp extends Application {
    private static volatile MainApp instance;

    public static MainApp getInstance() {
        return MainApp.instance;
    }

    @Override
    public void onCreate() {
        MainApp.instance = this;
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale(this.getResources());
    }

    public void setLocale(Resources res) {
        System.out.println("initApp: " + Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
        Configuration conf = res.getConfiguration();
        conf.locale = new Locale(Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
        res.updateConfiguration(conf, res.getDisplayMetrics());
    }
}

最后,这是显而易见的(我需要 android:configChanges="locale" 吗?):

<application
        android:name="...MainApp"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="....MainActivity"
            android:configChanges="locale"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Activity 重新启动 之前,您的配置无法应用,因此当您单击更改区域设置时,它不能立即应用,但是当您旋转屏幕时,Activity 会重新启动,从而应用您的配置更改。

您应该在点击更改语言环境后手动重启您的 Activity,这里是重启您的 Activity 的代码演示:

private void restartActivity() {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
    }

而且我认为你不应该在你的 Application class 中编写更改区域设置的代码,它应该写在你用来更改语言环境。

关于在以后打开应用时应用新的语言环境,您可以使用SharedPreferences保存您的配置并在每次打开应用程序时获取语言环境值并应用它。

您可以获得 SharedPreferences 并在 Application class 的 onCreate() 方法中应用语言环境。

你当然应该在你的清单中写 android:configChanges="locale|orientation" 并且 onConfigurationChanged() 方法也是 necessary.Because 如果你旋转屏幕或做任何其他改变系统配置的事情可以重新启动您的 Activity,默认语言环境将为 applied.So,您应该确保每次更改配置时应用新的语言环境。

关于如何处理区域设置更改的更多详细信息,您可以阅读:How to refresh activity after changing language (Locale) inside application

您的 setLocale 似乎更新了应用程序的配置。但是您已要求使用 android:configChanges="locale"

手动处理该配置更改

如果删除该行,您的配置更改可能会起作用。

我认为您可以从应用程序对象中删除 onConfigurationChange 方法。这不会让你进入无限循环吗?

更新:看起来手动更改语言环境配置不会导致 activity 重新启动。看看这个:Changing Locale within the app itself 如果可以的话,我会非常小心地使用 android:configChanges

我在 application 中覆盖了我的 ConfigChange ,如下所示,我每次都调用 setLocale 函数 configurationChanged :

public class AioApplication extends Application {

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale(LocaleUtility.getLocale());
    }

    @Override
    public void onCreate() {
        super.onCreate();

        LocaleUtility.initialize(this);
    }



    private void setLocale(Locale locale) {
        Configuration conf = getBaseContext().getResources().getConfiguration();
        conf.locale = locale;
        getBaseContext().getResources().updateConfiguration(conf, getResources().getDisplayMetrics());
        Configuration systemConf = Resources.getSystem().getConfiguration();
        systemConf.locale = locale;
        Resources.getSystem().updateConfiguration(systemConf, Resources.getSystem().getDisplayMetrics());
        Locale.setDefault(locale);
    }

}