我在我的应用程序“英语”和“法语”中实现了两种语言,并且它们都可以单独运行。当我试图用设备语言检查语言变化时,问题就出现了。
最近我的应用和设备语言是“法语”。现在我正在将设备语言从“法语”更改为“英语”,然后从后台打开应用程序,应用程序语言仍处于“法语”中,但是在应用程序中,导航抽屉相关内容更改为“英语”
以下是我在GlobalClass中完成的更改语言的代码
public void changelanguage(String languageToLoad, Context context) {
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
context.getResources().updateConfiguration(config,
context.getResources().getDisplayMetrics());
}
以下是在MainActivity和Splashscreen上比较语言的代码
gc = GlobalClass.getInstance()
prefsWrapper = PreferencesWrapper(applicationContext)
sel_langague = prefsWrapper.getPreferenceStringValue(SipConfigManager.LANGUAGE)
println("Language Main : " + sel_langague)
var languageToLoad = ""
if (sel_langague == "0") {
languageToLoad ="en"
} else {
languageToLoad ="fr"
}
gc!!.changelanguage(languageToLoad, baseContext)
有没有人知道如何解决这个问题?
答案 0 :(得分:5)
检查一下,
String language = preferences.getString("language", null);
这是我按钮的onclick监听器
llChangeLanguage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (language == null) {
LocaleHelper.setLocale(BaseActivity.this, "de");
Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
storeLanguageInPref("en");
startActivity(intent);
finish();
} else if ("kn".contentEquals(language)) {
LocaleHelper.setLocale(BaseActivity.this, "de");
Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
startActivity(intent);
storeLanguageInPref("en");
finish();
} else {
LocaleHelper.setLocale(BaseActivity.this, "kn");
Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
storeLanguageInPref("kn");
startActivity(intent);
finish();
}
}
});
在这里我将所选语言存储到首选项
private void storeLanguageInPref(String language) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(BaseActivity.this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("language", language);
editor.apply();
}
LocaleHelper类
public class LocaleHelper {
public static Context onAttach(Context context) {
String locale = getPersistedLocale(context);
return setLocale(context, locale);
}
public static String getPersistedLocale(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(SettingsFragment.KEY_PREF_LANGUAGE, "");
}
/**
* Set the app's locale to the one specified by the given String.
*
* @param context
* @param localeSpec a locale specification as used for Android resources (NOTE: does not
* support country and variant codes so far); the special string "system" sets
* the locale to the locale specified in system settings
* @return
*/
public static Context setLocale(Context context, String localeSpec) {
Locale locale;
if (localeSpec.equals("system")) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
//noinspection deprecation
locale = Resources.getSystem().getConfiguration().locale;
}
} else {
locale = new Locale(localeSpec);
}
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, locale);
} else {
return updateResourcesLegacy(context, locale);
}
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, Locale locale) {
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, Locale locale) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLayoutDirection(locale);
}
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
}
答案 1 :(得分:0)
您有两种不同的选择。
android:configChanges列出活动将自行处理的配置更改。在运行时发生配置更改时,默认情况下会关闭并重新启动活动,但声明具有此属性的配置将阻止活动重新启动。相反,活动仍在运行,并调用其onConfigurationChanged()方法。
注意:应避免使用此属性,并仅将其用作最后的手段。有关如何通过配置更改正确处理重新启动的更多信息,请阅读处理运行时更改。
以下任何或所有字符串都是此属性的有效值。多个值由' |'分隔。 - 例如," locale | navigation | orientation"。