繁体   English   中英

Android-我可以重新加载xml首选项文件吗?

[英]Android - Can I reload xml preference file?

我读过许多有关重新加载活动的文章。 我知道这不是要走的路。 但是,我的PreferenceActivity类通过xml文件加载其视图。 在该xml文件中,所有名称和描述均引用string.xml文件。 这些首选项之一是更改语言。 我使用onPreferenceChangeListener定义来捕获并立即设置新的Locale。 我希望行为类似于OS,在您更改语言后立即反映出来。

为了避免手动定义每个首选项,在此方法的末尾有没有办法强制我再次加载xml文件,从而从新的语言环境中获取所有字符串?

感谢您的帮助,这是我到目前为止的工作,为了节省空间,我删除了语言环境更改:

     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        Preference langPref = (Preference) findPreference("languagePreference");
        langPref.setOnPreferenceChangeListener( new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {

                /* CHANGE LOCALE */
                ...

                /* FORCE XML TO BE RELOADED */
                HOW?

                return false;
            }
        });
    }

我并不是说这是一个很好的答案,但是为了帮助他人,我已经能够针对我想要的问题做出临时解决方案:

我将我的更改侦听器创建放在一个名为setupListener的方法中。

/* FORCE XML TO BE RELOADED */

/* remove existing preferences */
PreferenceScreen prefScreen = getPreferenceScreen();
prefScreen.removeAll();

/* add preference screen */
MyPrefClass.this.addPreferencesFromResource(R.xml.preferences);

/* re-add listener */               
Preference langPref = (Preference) findPreference("languageLocale");
MyPrefClass.this.setupListener( langPref );            

偏好的状态对我来说还不能正确切换,但是现在我将继续使用它。

更新了完整代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        /* add language listener */
        Preference langPref = (Preference) findPreference("langLocale");
        this.setupListener( langPref );

}


protected void setupListener( Preference preference ) {

    preference.setOnPreferenceChangeListener( new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            /* set master config */
            Locale locale2 = new Locale( newValue.toString() );
            Locale.setDefault(locale2);
            Configuration config2 = new Configuration();
            config2.locale = locale2;

            /* add preference screen */
            getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

            /* remove existing preferences */
            PreferenceScreen prefScreen = getPreferenceScreen();
            prefScreen.removeAll();

            LusilKanjiDrawPreferences.this.addPreferencesFromResource(R.xml.preferences);
            setTitle(R.string.app_name_title);

            /* re-add listener */   
            Preference langPref = (Preference) findPreference("langLocale");
            LusilKanjiDrawPreferences.this.setupListener( langPref );

            return true;

        }
    });

}

警告 :现在不建议使用某些方法。 我将不得不自己研究可能的变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM