应用程序支持两种语言,当我更改语言时,我必须重新创建活动以显示所需的结果,但是我不想这样做。
private void setNewLocale(AppCompatActivity mContext, @LocaleManager.LocaleDef String language) {
LocaleManager.setNewLocale(this, language);
Intent intent = mContext.getIntent();
startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK));
}
我也再次在“所有”文本字段上设置了文本,但这没有帮助!
当我参加应用程序的第三次活动时,如果我想返回第二个活动,则更改语言;如果我想在第二个活动和第一个活动中输入文本,那么我也必须重新创建那些我认为是不好的方法的活动去做吧。 我只想更改语言,但不想重新创建活动!
单击按钮,我设置语言环境!
if(appPreference.getLanguage().equalsIgnoreCase("en")){
setNewLocale(MainActivity.this, LocaleManager.ARABIC);
}
else
setNewLocale(MainActivity.this, LocaleManager.ENGLISH);
答案 0 :(得分:1)
以下是更改应用程序语言环境的适当方法: 要以编程方式更改语言,必须克服一些困难。
解决方案:
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
String lang = getPersistedData(context, Locale.getDefault().getLanguage());
return setLocale(context, lang);
}
public static Context onAttach(Context context, String defaultLanguage) {
String lang = getPersistedData(context, defaultLanguage);
return setLocale(context, lang);
}
public static String getLanguage(Context context) {
return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static Context setLocale(Context context, String language) {
persist(context, language);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, language);
}
return updateResourcesLegacy(context, language);
}
private static String getPersistedData(Context context, String defaultLanguage) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}
private static void persist(Context context, String language) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SELECTED_LANGUAGE, language);
editor.apply();
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(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;
}
}
有关过程的完整说明:Link
答案 1 :(得分:0)
尝试以下代码,该代码将更新屏幕,而无需再次重新启动或重新创建活动
private void setNewLocale(AppCompatActivity mContext, @LocaleManager.LocaleDef String language) {
val newConfig = baseContext.resources.configuration
newConfig.setLocale(Locale(language))
onConfigurationChanged(newConfig)
}
override fun onConfigurationChanged(newConfig: Configuration) {
updateLabels()
super.onConfigurationChanged(newConfig)
}
private fun updateLabels() {
//update all the views text here
editTextMobileNumber.hint = getString(R.string.login_mobile_number_edit_text_hint)
}