使用ActionBarActivity和SupportActionBar以编程方式更改区域设置

时间:2015-04-25 15:49:53

标签: android locale android-support-library

我有一个多语言应用,Locale以编程方式更改。

首次创建应用程序时,它会查找特定的SharedPreferences文件并相应地设置区域设置。

然后,用户可以进入特定的Activity P并选择可用的语言(现在只有两种语言可用)。

这就是我在P中所做的事情,langString

// set locale to that chosen by the user
((MyApp) getApplication()).setMyAppLocale(lang); 

// get the Locale object
Locale locale = ((MyApp) getApplication()).getMyAppLocale();

// classic code
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
      getBaseContext().getResources().getDisplayMetrics());

// clear the activity stack and restart the MainActivity
Intent intent = new Intent(this, MainActivity.class);
Bundle extras = new Bundle();
extras.putBoolean(MainActivity.PARAM_DO_RESTART, true);
intent.putExtras(extras);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

活动MainActivity收到新的Intent并执行此操作:

@Override
public void onNewIntent(Intent anotherIntent) {
    super.onNewIntent(anotherIntent);
    setIntent(anotherIntent);
}

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if(extras != null) {
        if (extras.getBoolean(PARAM_DO_RESTART, false)) {
            intent.putExtra(PARAM_DO_RESTART, false);
            setIntent(intent);
            finish();
            startActivity(intent);
        }
    } // if extras != null

通过这种方式,再次调用MainActivity onCreate,并在新Locale中再次加载资源。

一切都很好,但有一点

所有字符串都显示在正确的区域设置中,但所有活动的标题都保留在启动应用时首次创建的语言。他们没有改变。我的活动实际上是ActionBarActivity的实例,标题显示在SupportActionBar中。

问题:如何根据当前Locale强制更改这些标题?

注意:一个简单的解决方案是为getSupportActionBar().setTitle(getString(R.string.title_activity_X));每个Activity X调用 var qry = (from client in AgencyContext.Client join estate in AgencyContext.Estate on client.ClientID equals estate.ClientID select new { ClientId = estate.ClientId, ClientName = client.ClientName }); 。但是,由于有很多活动,我宁愿找到一种方法让它自动完成。

注意:我使用的是API Level 19,支持库v7。

2 个答案:

答案 0 :(得分:0)

根据此answer,标题是只读的,因此您应手动指定标题,而不能自动执行。我的猜测是因为它使用AndroidManifest.xml中指定的资源,无法动态更改。

答案 1 :(得分:0)

我在MiroM向this question on StackOverflow提供的答案中找到了一种方法。将以下代码添加到基本Activity类中,无论它最适合哪个类。

PackageManager pm = getPackageManager();
    try {
        ActivityInfo ai = pm.getActivityInfo(this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA);
        if (ai.labelRes != 0) {
            getSupportActionBar().setTitle(ai.labelRes);
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.stacktrace();
    }

我希望其他人能够解决这个问题并提供一种更通用的方法。当你的活动有一个共同的超类时,这种方法非常有用,这是我的情况,但一般情况下都不是这样。