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

pgs*_*rom 25 resources android localization

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

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

Jim*_*ler 17

在AndroidManifest.xml中,将此属性添加到您的Activity中

android:configChanges="locale"
Run Code Online (Sandbox Code Playgroud)

在您的活动覆盖中 onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // refresh your views here
  super.onConfigurationChanged(newConfig);
}
Run Code Online (Sandbox Code Playgroud)

https://developer.android.com/guide/topics/manifest/activity-element.html#config

  • @JimBlackler你的意思是"在这里刷新你的看法"?这是使用语言资源文件自动发生的,还是我必须自己为每个视图手动完成? (6认同)
  • 我不认为如何刷新视图.我将区域设置存储在共享prefs中并将其加载到onConfigurationChanged中,但在选择新区域设置后没有任何刷新. (3认同)
  • 用户不讨厌吗?我常常认为没有它们会更好:-)无论如何,如果你已经推出了自己的语言选择器,为什么你难以刷新你的布局? (2认同)

MSq*_*are 9

我认为问题是在运行时为应用程序切换语言并在UI中显示本地化消息.如果在应用程序运行时更改了系统区域设置(在设备设置中),而不是在应用程序代码中更改区域设置时android:configChanges="locale"调用onConfigurationChanged,我想这是您想要完成的.这就是为什么它不令人耳目一新.


3c7*_*c71 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);
}
Run Code Online (Sandbox Code Playgroud)