我正在开发一个Android应用程序,我希望为用户提供在运行时设置语言的选项。但我的数据来自英文版的JSON,我想根据选择的语言在应用程序中设置它。
我已尝试为不同的语言环境使用各种值文件夹,但它不符合我的要求,我想在运行时更改数据,但我的数据正在动态变化。
答案 0 :(得分:0)
好的,你想在运行时更改语言环境吗?我以前做过这个,效果很好。以编程方式搜索“android change locale”,您会发现许多讨论,例如Set Locale programmatically。在我的情况下,我希望在活动关闭时恢复默认语言环境,但您可能想要做一些不同的事情。实际上,重置区域设置比首先更改它更难,因为我必须处理方向更改。
警告:我在Stack Overflow编辑器中编辑了这段代码,所以可能会有一些拼写错误。它没有按原样运行:)
public class MyActivity extends Activity {
private static final String LOG_TAG = MyActivity.class.getSimpleName();
private static final String LOCALE_EXTRA = "locale";
private Locale customLocale;
private boolean restartingForLocaleChangeFlag;
protected void useLocale(Locale locale) {
Intent intent = getIntent();
if (locale == null) {
Locale def = Locale.getDefault();
Log.i(LOG_TAG + ".useLocale", "restarting the activity" +
" in the default locale " + def);
intent.putExtra(LOCALE_EXTRA, def);
} else {
Log.i(LOG_TAG + ".useLocale", "restarting the activity in" +
" the " + locale + " locale");
intent.putExtra(LOCALE_EXTRA, locale);
}
restartingForLocaleChangeFlag = true;
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
private void simpleSetLocale(Configuration config, Locale loc) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.setLocale(loc);
} else {
config.locale = loc;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent.hasExtra(LOCALE_EXTRA)) {
Object extra = intent.getSerializableExtra(LOCALE_EXTRA);
if (extra != null && extra instanceof Locale) {
customLocale = (Locale) extra;
Resources res = getResources();
Configuration config = res.getConfiguration();
simpleSetLocale(customLocale);
res.updateConfiguration(config, res.getDisplayMetrics());
}
}
}
@Override
public void onStop() {
super.onStop();
// reset locale
if (customLocale != null && !restartingForLocaleChangeFlag) {
customLocale = null;
Locale defaultLocale = Locale.getDefault();
Log.i(LOG_TAG + ".useLocale", "reverting the locale to" +
" the default " + defaultLocale);
Resources res = getResources();
Configuration config = res.getConfiguration();
simpleSetLocale(config, defaultLocale);
res.updateConfiguration(config, res.getDisplayMetrics());
}
}
}