【问题标题】:How to Refresh App with onConfigChanges without loosing instance如何使用配置更改刷新应用程序而不丢失实例
【发布时间】:2016-08-23 14:52:27
【问题描述】:

    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 不适用于语言环境,因为它适用于 Orientation。

谢谢!

【问题讨论】:

    标签: android android-studio android-activity locale instancestate


    【解决方案1】:

    在您的 MainActivity 调用中 onStart 回调上的 sharedPrefrences 调用 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();
    }
    

    【讨论】:

    • 当我选择另一种语言时,我需要更改活动语言...所有应用程序应自动更改为所选语言...
    【解决方案2】:

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

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

    【讨论】:

    • 不适合我... :(
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 2019-04-25
    • 2016-10-22
    • 2019-09-16
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多