【发布时间】:2015-05-26 13:04:07
【问题描述】:
我想更改我的应用程序(运行时)的语言环境。到目前为止它运行良好。唯一剩下的就是刷新当前活动。
文档说更新语言环境配置应该重新启动正在运行的活动(与屏幕方向相同的行为),但在我的情况下它确实重新启动它。 (我没有使用android:configChanges="locale" 来防止这种行为)。
以下是关键部分:
我有我的活动:
public class SettingsActivity extends Activity {
ExpandableListAdapter listAdapter;
//....
}
我绑定点击的适配器(在 getChildView 函数内):
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
//...
convertView = inflater.inflate(R.layout.list_item, null);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
I18N.setLang(context, "fr");
};
});
}
我的 I18N 类中的 setLang 方法: 公共类 I18N {
public static void setLang(final Context context, String langCode)
{
if (langCode.equals(""))
return;
try {
final Locale newLocale;
final String[] languageRegion = langCode.split("\\-(r)?");
I18N.saveLocale(context, langCode);
newLocale = languageRegion.length > 1 ? new Locale(languageRegion[0], languageRegion[1]) : new Locale(languageRegion[0]) ;
current = newLocale;
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale(languageRegion[0]);
res.updateConfiguration(conf, dm);
}
catch (Exception e) {
Log.e("exception", e.getMessage() + e.getClass());
}
}
}
我已经试过了。它有点工作,但我不喜欢这种手动刷新活动的想法。
主要问题是尽管使用了标志FLAG_ACTIVITY_NO_HISTORY,但历史记录(使用移动设备的后退按钮)无法正常工作(每次单击列表更改语言仍会创建一个历史记录):
Intent refresh = new Intent(context, context.getClass());
refresh.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(refresh);
我做错了什么?如何使 updateConfiguration 重新启动活动或使手动意图不创建历史记录?
【问题讨论】: