我正在尝试为我的应用创建设置部分。我有一个res / xml / settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:key="numberOfYears"
android:title="Number of Years to Read the Bible"
android:summary="How many years would you like to take to read through the reading plan?"
android:entries="@array/numberOfYears"
android:entryValues="@array/numberOfYears"
android:dialogTitle="How Many Years?"
/>
<CheckBoxPreference android:key="ignoreDates"
android:title="Ignore Dates"
android:summary="Would you like to use the dates in the plan?"
/>
</PreferenceScreen>
我有一个名为Preferences的类,它扩展了PreferenceActivity并包含以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
我不确定这是否是必需的,但我还在主要活动中添加了以下内容:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, PREFS_MENU, Menu.NONE, "Preferences");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d(TAG, "Menu Item: " + item.getItemId());
switch (item.getItemId()) {
case PREFS_MENU :
startActivity(new Intent(this, Preferences.class));
return true;
}
return false;
}
这似乎有效,我得到一个“首选项”菜单,选中后会启动我的首选项。但是,当我选择任何值时,值似乎并不坚持。我的理解是android:key足以让系统在默认的共享首选项中设置所选的值 - 这不是这种情况吗?
我错过了什么?
答案 0 :(得分:0)
不确定我是否正确地做了这件事,我也希望得到投入或其他最佳或更好的做法。
我使我的PreferenceActivity类也实现了OnSharedPreferenceChangeListener,并且实现了这样的方法:
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
// TODO Auto-generated method stub
Preference pref = findPreference(arg1);
if (pref instanceof ListPreference) {
ListPreference listPref = (ListPreference)pref;
pref.setSummary(listPref.getEntry());
}
else {
pref.setSummary(arg0.getString(arg1, pref.getSummary().toString()));
}
}