所以我的应用程序中有一个语言设置。当语言切换时,我希望所有的文本视图等立即改变语言。目前我只是更改配置中的语言环境,因此当用户重新启动活动时语言已更改。
我的问题的一个丑陋的解决方案是每次语言更改时使每个textview加载新资源。有更好的解决方案吗?也许是一种巧妙的方式来离散地重启活动?或者只是强制重新加载资源?
答案 0 :(得分:17)
在AndroidManifest.xml中,将此属性添加到您的活动
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
答案 1 :(得分:9)
我认为问题是在应用程序的运行时切换语言并在UI中显示本地化消息。 android:configChanges="locale"
如果系统区域设置在应用程序运行时更改(在您的设备设置中),则调用onConfigurationChanged
,如果您更改了应用程序代码中的区域设置,则{{1}}调用{{1}},我想这就是您想要的去完成。这就是为什么它不令人耳目一新。
答案 2 :(得分:7)
这是我在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);
}
答案 3 :(得分:0)
我不确定为什么
onConfigurationChanged()
没有提到这一点。
嘿,sandis,你的意思是当你改变语言时,你的活动中没有调用onConfigurationChanged()
方法吗?我遇到了同样的问题。问题可能是:当我们更改语言时,活动会转到onDestroy()
(您可以尝试此操作),因此无人可以调用onConfigurationChanged()
。当我们再次启动活动时,会调用onCreate()
,而不是onConfigurationChanged()
。区域变更和方向变化可能有所不同。
答案 4 :(得分:0)
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
}
答案 5 :(得分:-1)
假设您正在通过类似
的方式更改语言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"
时更改了系统语言,则会发生这种情况。