1

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


            SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
            Configuration config = getBaseContext().getResources().getConfiguration();

            String lang = settings.getString("lang_list", "");
            // Log.d("Lang",lang);
            if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) {
                recreate();
                Locale locale = new Locale(lang);
                Locale.setDefault(locale);
                config.locale = locale;
                getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
            }

            if (AppController.getInstance().isPreferenceChanged()) {
                setupViewPager(viewPager);
                adapter.notifyDataSetChanged();
            }
        }

我想更改应用程序语言而不重新创建应用程序。我的意思是当用户从设置中选择任何语言时我想这样做,然后它应该在不使用的情况下更改设置活动语言recreate();,因为当我使用recreate();它时,应用程序会闪烁一次。

所以我没有使用recreate();. 相反,我在设置活动中编写了以下代码AndroidManifest.xml

<activity
            android:name=".activity.SettingsActivity"
            android:label="@string/title_activity_settings"
            android:configChanges="orientation|keyboardHidden|screenSize|locale|layoutDirection"/>

如下图所示,您可以看到我选择了“印地语”作为语言,但它没有将活动更新为印地语。我的意思是“选择国家”、“选择您的语言”和“选择类别”应该用印地语而不是英语显示。我用两种语言写过字符串。

任何人都可以知道更改语言时如何更改它吗?或为什么 onConfigChanges 不适用于区域设置,因为它适用于方向。

谢谢 !

在此处输入图像描述

4

2 回答 2

0

在你的 MainActivity 调用 sharedPrefrences onStart 回调 insted 调用 onCreate

示例: -

protected void onStart() {
    SharedPreferences sharedPreferences = this.getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE);
    String pine = sharedPreferences.getString("language", DEFAULT);
    String languageToLoad = pine;
    Locale locale = new Locale(languageToLoad);//Set Selected Locale
    Locale.setDefault(locale);//set new locale as default
    Configuration config = new Configuration();//get Configuration
    config.locale = locale;//set config locale as selected locale
    this.getResources().updateConfiguration(config, this.getResources().getDisplayMetrics());
    invalidateOptionsMenu();  //This changes language in OptionsMenu too
    setTitle(R.string.app_name);  //calling app name according to language selected by user
    super.onStart();
}
于 2016-08-23T15:33:25.547 回答
0

您可以使用单例类来处理语言更改而无需重新启动活动,

public class MyApplication extends Application
{
    private Locale locale = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if (locale != null)
        {
            newConfig.locale = locale;
            Locale.setDefault(locale);
            getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
        }
    }

    @Override
    public void onCreate()
    {
        super.onCreate();

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

        Configuration config = getBaseContext().getResources().getConfiguration();

        String lang = settings.getString(getString(R.string.pref_locale), "");
        if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
        {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
}
于 2016-08-23T15:34:53.733 回答