Хорошо, вот что я закончил с помощью Куртиса.
По сути, в моем коде, запускающем действие «Предпочтения», у меня нет действий для всех предпочтений и действий, если вы хотите только некоторые из них. Действие должно совпадать с ключом какого-либо предпочтения или группы предпочтений.
// all preferences
Intent launchPreferencesIntent = new Intent().setClass(this,
PreferencesFromXml.class);
startActivity(launchPreferencesIntent);
// just key_trip_plot_control_preferences
Intent launchPreferencesIntent = new Intent(
getString(R.string.key_trip_plot_control_preferences))
.setClass(this, PreferencesFromXml.class);
startActivity(launchPreferencesIntent);
В моем классе PreferencesFromXml я всегда добавляю предпочтения из xml, но затем, если у меня есть действие, я выполняю поиск, хотя предпочтения ищут соответствующий ключ. Если я найду один, я удаляю все предпочтения, затем добавляю соответствующий или его дочерние элементы, если это PreferenceGroupe обратно.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
String act = getIntent().getAction();
if (act != null) {
Preference res = findPreferenceByKey(getPreferenceScreen(), act);
if (res != null) {
getPreferenceScreen().removeAll();
if (res instanceof PreferenceGroup) {
PreferenceGroup groupe = (PreferenceGroup) res;
// add sub items
for (int i = 0; i < groupe.getPreferenceCount(); i++) {
Preference pref = groupe.getPreference(i);
if (pref != null) {
getPreferenceScreen().addPreference(pref);
}
}
} else { // just add the item.
getPreferenceScreen().addPreference(res);
}
}
}
}
protected Preference findPreferenceByKey(PreferenceGroup in, String key) {
for (int i = 0; i < in.getPreferenceCount(); i++) {
Preference pref = in.getPreference(i);
if (pref == null) {
// should not happen
Log.v(TAG, "findPreferenceByKey null pref i:" + i);
return null;
} else if (pref.hasKey() && pref.getKey().equals(key)) {
return pref;
} else if (pref instanceof PreferenceGroup) {
// recurse
Preference res = findPreferenceByKey((PreferenceGroup) pref,
key);
if (res != null) {
return res;
}
}
}
return null;
}