我有一个多语言应用,Locale
以编程方式更改。
首次创建应用程序时,它会查找特定的SharedPreferences
文件并相应地设置区域设置。
然后,用户可以进入特定的Activity P
并选择可用的语言(现在只有两种语言可用)。
这就是我在P
中所做的事情,lang
是String
:
// 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。
答案 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();
}
我希望其他人能够解决这个问题并提供一种更通用的方法。当你的活动有一个共同的超类时,这种方法非常有用,这是我的情况,但一般情况下都不是这样。