如何在运行时将Android语言环境更改为中文?

时间:2014-07-28 09:56:45

标签: android json localization

我正在开发一个Android应用程序,我希望为用户提供在运行时设置语言的选项。但我的数据来自英文版的JSON,我想根据选择的语言在应用程序中设置它。

我已尝试为不同的语言环境使用各种值文件夹,但它不符合我的要求,我想在运行时更改数据,但我的数据正在动态变化。

1 个答案:

答案 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());
        }
    }

}

Gist