我在我的应用程序中有一个语言设置。当语言切换时,我希望所有的文本视图等立即更改语言。目前,我只是在配置文件中更改区域设置,所以当用户重新启动活动时,语言已经改变。
一个丑陋的解决方案是每次语言更改时让每个文本视图加载新资源。是否有更好的解决方案?也许有一种优雅的方式来离散地重新启动活动?或者只是强制重新加载资源?
我在我的应用程序中有一个语言设置。当语言切换时,我希望所有的文本视图等立即更改语言。目前,我只是在配置文件中更改区域设置,所以当用户重新启动活动时,语言已经改变。
一个丑陋的解决方案是每次语言更改时让每个文本视图加载新资源。是否有更好的解决方案?也许有一种优雅的方式来离散地重新启动活动?或者只是强制重新加载资源?
在AndroidManifest.xml文件中,将此属性添加到您的Activity中
android:configChanges="locale"
在您的活动中覆盖onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
// refresh your views here
super.onConfigurationChanged(newConfig);
}
https://developer.android.com/guide/topics/manifest/activity-element.html#config
我认为问题是在应用运行时切换语言并在UI中显示本地化消息。 android:configChanges="locale"
在设备设置中更改系统语言环境时(应用正在运行),调用 onConfigurationChanged
函数,但如果您想要在应用程序代码中更改语言环境,则不会调用该函数,因此界面不会更新。
以下是我在每个活动的onCreate()或onResume()方法中使用的方法(根据我的需求,如果我的活动将在用户更改语言设置后恢复,或者始终已经设置了语言):
然后我只需手动刷新视图,或从onConfigurationChanged()中刷新视图,该方法在此方法完成后调用。
public static void changeLocale(Activity activity, String language)
{
final Resources res = activity.getResources();
final Configuration conf = res.getConfiguration();
if (language == null || language.length() == 0)
{
conf.locale = Locale.getDefault();
}
else
{
final int idx = language.indexOf('-');
if (idx != -1)
{
final String[] split = language.split("-");
conf.locale = new Locale(split[0], split[1].substring(1));
}
else
{
conf.locale = new Locale(language);
}
}
res.updateConfiguration(conf, null);
}
假设您是通过类似以下方式更改语言的
private void updateLocale(@NonNull final Context context,
@NonNull final Locale newLocale) {
final Resources resources = context.getResources();
final DisplayMetrics displayMetrics = resources.getDisplayMetrics();
final Configuration configuration = resources.getConfiguration();
configuration.locale = newLocale;
resources.updateConfiguration(configuration, displayMetrics);
Locale.setDefault(newLocale);
}
您需要在所有当前打开的活动中调用Activity.recreate(),这就是当用户在您没有订阅android:configChanges="locale"
时更改系统语言会发生的情况。
public void settingLocale(Context context, String language) {
Locale locale;
Configuration config = new Configuration();
if(language.equals(LANGUAGE_ENGLISH)) {
locale = new Locale("en");
Locale.setDefault(locale);
config.locale = locale;
}else if(language.equals(LANGUAGE_ARABIC)){
locale = new Locale("hi");
Locale.setDefault(locale);
config.locale = locale;
}
context.getResources().updateConfiguration(config, null);
// Here again set the text on view to reflect locale change
// and it will pick resource from new locale
tv1.setText(R.string.one); //tv1 is textview in my activity
}
onConfigurationChanged()
不能被检测到。onConfigurationChanged()
方法没有在你的活动中调用?我也遇到了同样的问题。问题可能是这样的:当我们更改语言时,活动将进入onDestroy()
(你可以试试),因此没有人可以调用onConfigurationChanged()
。当我们再次启动活动时,将调用onCreate()
而不是onConfigurationChanged()
。在本地更改和方向更改中可能有所不同。