更改区域设置:强制活动重新加载资源?

时间:2010-04-15 10:14:31

标签: android localization resources

所以我的应用程序中有一个语言设置。当语言切换时,我希望所有的文本视图等立即改变语言。目前我只是更改配置中的语言环境,因此当用户重新启动活动时语言已更改。

我的问题的一个丑陋的解决方案是每次语言更改时使每个textview加载新资源。有更好的解决方案吗?也许是一种巧妙的方式来离散地重启活动?或者只是强制重新加载资源?

6 个答案:

答案 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"时更改了系统语言,则会发生这种情况。