[英]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.