У меня есть PreferenceActivity с набором PreferenceScreens (Sub). Каждый такой PreferenceScreen (Sub) представляет учетную запись и имеет имя пользователя учетной записи как его заголовок.
PreferenceScreen root = mgr.createPreferenceScreen(this);
for (MyAccountClass account : myAccounts) {
final PreferenceScreen accScreen = mgr.createPreferenceScreen(this);
accScreen.setTitle(account.getUsername());
// add Preferences to the accScreen
// (for instance a "change username"-preference)
...
root.add(accScreen);
}
Поскольку пользователь вводит sub-PreferenceScreen и редактирует имя пользователя учетной записи, я хочу, чтобы внешний PreferenceScreen обновил, это - PreferenceScreen-заголовок для рассматриваемой учетной записи.
Я попытался добавить...
usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
accScreen.setTitle(newValue.toString());
return true;
}
});
... но accScreen.setTitle, кажется, не вступает в силу на внешнем PreferenceScreen. У меня есть примечание тот вызов onContentChanged();
на самом деле заставляет его работать, но я понимаю, что это - вероятно, не предпочтительный способ сделать его.
Я подозреваю, что должен звонить postInvalidate()
на некотором представлении где-нибудь, но я действительно не могу выяснить на том, какое представление и когда сделать это.
Обновление PreferenceScreen android:summary! может быть experiening та же проблема как я.
Любая справка ценится.
Возникла та же проблема, но onContentChanged () у меня не работает. Моя проблема связана с PreferenceScreens, которые находятся на глубине более одного уровня от корня.
Следуя вашему примеру, вы сначала создали PreferenceScreen «Учетные записи», а затем добавили под него каждый из ваших индивидуальных объектов PreferenceScreen. Примерно так:
Root Screen -> "Accounts" screen -> "foo@example.com" screen -> edit username -> edit password -> etc... -> "bar@example.com" screen -> "baz@example.com" screen -> etc...
Если пользователь отредактировал свое имя пользователя и нажал кнопку «Сохранить», вызов PreferenceActivity.onContentChanged (), похоже, влияет только на прямых потомков корневого PreferenceScreen. Заголовки и сводки экранов третьего поколения не перерисовываются, они по-прежнему отражают старые значения.
Просматривая код onContentChanged (), похоже, что он просто повторно привязывает () корневой экран к ListView ListActivity, хотя я не думаю, что последующие PreferenceScreens когда-либо были привязаны к ListView (не так ли?) , поэтому мы не можем ничего вручную повторно привязать ...
Единственный обходной путь, который я могу придумать, - это создать подменю как изолированные PreferenceActivitys вместо PreferenceScreens, чтобы мы могли намеренно вызвать onContentChanged () для нашего прямого предка. Но это даже большая путаница, чем текущий обходной путь. Есть идеи?