16

我有一个活动,在 onCreate 我从首选项加载语言并设置这样的语言环境:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
    Locale newLocale = new Locale(lang);
    Locale.setDefault(newLocale);

    Configuration config = new Configuration();
    config.locale = newLocale;

    final Resources res = getResources();
    res.updateConfiguration(config, res.getDisplayMetrics());
}

我也覆盖 onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
    Locale newLocale = new Locale(lang);
    Locale.setDefault(newLocale);

    Configuration config = new Configuration();
    config.locale = newLocale;

    final Resources res = getResources();
    res.updateConfiguration(config, res.getDisplayMetrics());
}

我有一个带有 FragmentPagerAdapter 的 ViewPager 和 android 2.3.7 上的三个选项卡。问题是,有时在切换选项卡时,应用程序的区域设置会恢复为英语,因此从现在开始 UI 会混合使用多种语言。我总是在适配器的 getItem() 方法中为选项卡创建新片段。如果我旋转设备,则区域设置再次正确。

我还尝试将 android:configChanges="locale" 放在清单中,而不是覆盖 onConfigurationChanged(),但结果是一样的。

最糟糕的是,它不是 100% 可重现的,它只会发生几次,而且我也收到了来自用户的报告。一旦应用程序启动并且在切换几个选项卡后它不会更改区域设置,那么它将正确直到退出。

4

1 回答 1

17

一段时间后,我想出了一个办法。唯一对我有用的解决方案是始终在主要 Acitivity 的 onCreate()、每个 Fragment 的 onCreateView()、每个 BroadcastReceiver() 的 onReceive() 中(如果它加载一些资源)和每个服务的开头设置语言环境。为此,我在主要且唯一的活动中创建了一个静态方法 setLocale()。如果您有更多活动,则可以将其放置在自定义应用程序类中。

最后一件事。如果应用程序直接从 IDE 启动以进行调试,即使这有时也不起作用。别担心,如果它在设备上正常运行,它就可以工作(至少对我来说)。

public static void setLocale(Context context) {
    final String lang = PreferenceManager.getDefaultSharedPreferences(context).getString("locale", "en");
    final Locale newLocale = new Locale(lang);
    Locale.setDefault(newLocale);
    final Configuration config = new Configuration();
    config.locale = newLocale;

    final Resources res = context.getResources();
    res.updateConfiguration(config, res.getDisplayMetrics());
}
于 2012-09-03T08:58:43.197 回答