Android - 更改所有 Android 版本的应用程序语言
Posted
技术标签:
【中文标题】Android - 更改所有 Android 版本的应用程序语言【英文标题】:Android - Changing app language for all versions of Android 【发布时间】:2020-04-06 17:18:00 【问题描述】:我尝试了几种方法来更改 android 应用的语言环境,但是当我在 Android 7.0 或更低版本上测试我的应用时,语言环境没有改变。
注意:这些方法适用于 Android 8.0 或更高版本,但不适用于 Android 7.0 或更低版本。
哪种方式适用于所有 Android 版本? 你知道吗?
我尝试过的方法:
The first way
The second way
The third way
注意:我在装有 Android 7.0 的 Galaxy Tab S2 上测试了我的应用程序(没有工作)。在装有 Android 8.0(已工作)的 Galaxy A5 2017 上。
注意:我的许多活动都是用 Kotlin 编写的。
我的代码:
Locale Helper 类:
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);
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;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
attachBaseContext 方法(我把这些代码放在我所有的活动中):
override fun attachBaseContext(base: Context?)
super.attachBaseContext(LocaleHelper.onAttach(base, "en"))
更改语言环境方法(转波斯语):
LocaleHelper.setLocale(getContext(), "fa")
【问题讨论】:
提及,你已经尝试过。 你是否根据语言环境创建了不同的资源文件? 感谢您的关注 - 我添加了我为您尝试过的方法列表。 感谢您的关注 - 是的,我创建了想要打开这些资源的资源。 您的应用程序的默认语言是“en”,不是吗?如果是,则需要将波斯语资源放在 en 的字符串值中,英语资源则反之。 【参考方案1】:例如,您应该创建一个基本活动并覆盖 onConfigurationChange
方法,设置您保存在共享首选项中的默认语言。毕竟,您必须从基本活动扩展您的活动。
【讨论】:
感谢您的回答。 - 我做到了,但我在所有活动中都使用了 attachBaseContext 方法。我应该使用 onConfigurationChange 吗? 如果你扩展了 BaseActivity 的所有活动,你不应该这样做,尽管这是一个更好的方法。如果不这样做,则应覆盖 attachBaseContext。 你能说得简单点吗? 我的意思是,当用户在您的应用程序中更改区域设置时,所有活动都应该重置,并且在 attachBaseContext 中,您应该这样做 (setLocale())。如果您从基本活动扩展所有活动,则不需要覆盖 attachBaseContext,因为您只需要重置主要活动。好吗? 好的。我知道了。谢谢你,Mostafa,我会尽力做你指出的事情。顺便告诉你结果。以上是关于Android - 更改所有 Android 版本的应用程序语言的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android Studio 中更改所需的 Android 版本? [复制]