(Android) 更改语言无法正常工作

(Android) Change language doesn't work properly

我在 MainActivity.java 中选择我的应用程序的语言,有时它无法正常工作。

这是我在 onCreate 方法上的代码:

if(!SaveSharedPreference.getUserId(MainActivity.this).equals("")) {
    if (SaveSharedPreference.getWhoLoggedIn(MainActivity.this).equals("Main_User")) {
        FetchUserLanguage fetchUserLanguage = new FetchUserLanguage();
        fetchUserLanguage.execute();
    } 
} else {
    sDefSystemDefaultLanguage = Resources.getSystem().getConfiguration().locale;
    Configuration configuration = new Configuration();
    configuration.locale = sDefSystemDefaultLanguage;
    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
}

FetchUserLanguage 中,我从我的数据库中获取每个用户的语言(它正确返回值)。

我设置Locale的方法是下一个:

@Override
protected void onPostExecute(String result) {
    switch (result) {
        case "English":
            locale = new Locale("en");
            configuration = new Configuration();
            configuration.locale = locale;
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
        case "Deutsch":
            locale = new Locale("de");
            configuration = new Configuration();
            configuration.locale = locale;
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
        default:
            locale = Resources.getSystem().getConfiguration().locale;
            configuration = new Configuration();
            configuration.locale = locale;
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
    }
}

当我 运行 来自 Android Studio 的应用程序时,它运行完美,所有应用程序都设置为所选语言,但是,如果我关闭并再次打开它,第一个屏幕正在以英语显示,(另一个是德语)。设备的语言是英语,Android 项目的默认语言也是如此。

也许我漏掉了什么。

非常感谢。

我终于找到了解决方案。

问题是我在异步线程中进行翻译过程,所以应用程序仍然是 运行,并且在屏幕更改之前,一些布局没有更改为新语言。

解决方法是在onPostExecute()方法的末尾创建Intent:

@Override
protected void onPostExecute(String result) {
    switch (result) {
        case "English":
            locale = new Locale("en");
            Locale.setDefault(locale);
            configuration = new Configuration();
            configuration.locale = locale;
            SaveSharedPreference.setUserLanguage(MainActivity.this, locale.getLanguage());
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
        case "Deutsch":
            locale = new Locale("de");
            Locale.setDefault(locale);
            configuration = new Configuration();
            configuration.locale = locale;
            SaveSharedPreference.setUserLanguage(MainActivity.this, locale.getLanguage());
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
        default:
            locale = Resources.getSystem().getConfiguration().locale;
            Locale.setDefault(locale);
            SaveSharedPreference.setUserLanguage(MainActivity.this, locale.getLanguage());
            configuration = new Configuration();
            configuration.locale = locale;
            getBaseContext().getResources().updateConfiguration(configuration,
                    getBaseContext().getResources().getDisplayMetrics());
            break;
    }
    Intent intent = new Intent(MainActivity.this, MainMenuActivity.class);
    if(SaveSharedPreference.getUserType(MainActivity.this).equals("Full")) {
        intent.putExtra("Type", "Full");
    }
    startActivity(intent);
    finish();
}