Обновите существующий Предпочтительный объект в PreferenceActivity после возврата из (sub) PreferenceScreen

У меня есть 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 та же проблема как я.

Любая справка ценится.

9
задан Community 23 May 2017 в 10:29
поделиться

1 ответ

Возникла та же проблема, но 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 () для нашего прямого предка. Но это даже большая путаница, чем текущий обходной путь. Есть идеи?

1
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: