Сводка ListPreference не форматируется - PullRequest
0 голосов
/ 18 июля 2011

У меня есть ListPreference, и я хочу показать текущую запись в сводке. Согласно документам для ListPreference.getSummary () , я должен быть в состоянии сделать это, включив %s в итоговую строку. К сожалению, активность просто отображает %s в сводке.

XML довольно стандартный:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <ListPreference
        android:key="displayMode"
        android:summary="@string/display_mode_summary"
        android:title="@string/display_mode"
        android:defaultValue="BOTH"
        android:entries="@array/displayModes"
        android:entryValues="@array/displayModeValues"
        />
</PreferenceScreen>

Значение строки display_mode_summary равно %s. (Значение "BOTH" присутствует в массиве displayModeValues.) Если я создаю подкласс ListPreference следующим образом:

public final class DisplayModePreference extends ListPreference {
    // ...

    @Override
    public CharSequence getSummary() {
        return String.format(super.getSummary().toString(), getEntry());
    }
}

затем, когда начинается действие предпочтений, текущее значение правильно интерполируется в сводку. Но когда я нажимаю на предпочтение и выбираю другое значение из диалогового окна, когда диалоговое окно закрывается, в сводке все еще отображается старое значение. Мне нужно закрыть действие настроек и перезапустить его, чтобы увидеть изменения.

Я пробовал это в нескольких эмуляторах на разных уровнях API. Что мне нужно, чтобы отображаемая сводка всегда отображала текущее значение?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Вы можете переопределить «onDialogClosed», как показано ниже:

@override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        setSummary(getEntry());
    }
}

Это установит сводку ваших предпочтений к тексту выбранной записи.

0 голосов
/ 07 августа 2018

Оригинал getSummary() в ListPreference работает только тогда, когда getEntries(), getEntryValues() и defaultValue предварительно заполнены, когда загружается экран настроек. Так что он отлично работает, когда вы используете статический фиксированный список элементов, например, ресурс <string-array>.

Но если вы динамически генерируете entries и entryValues во время выполнения, вам нужно убедиться, что эти списки генерируются при загрузке экрана предпочтений в onCreate(), а также , что defaultValue набор . Примерно так:

SettingsFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ListPreference listPreference = (ListPreference) findPreference("dynamiclistItems");

    CharSequence[] entryDisplayNames = new CharSequence[3];
    entryDisplayNames[0] = "Item A";
    entryDisplayNames[1] = "Item B";
    entryDisplayNames[2] = "Item C";

    CharSequence[] entryValues = new CharSequence[3];
    entryValues[0] = "Item A Value";
    entryValues[1] = "Item B Value";
    entryValues[2] = "Item C Value";

    listPreference.setEntries(entryDisplayNames);
    listPreference.setEntryValues(entryValues);

    if (listPreference.getValue() == null ||
         listPreference.getValue().equals("")) {
        // There is no stored string in shared prefs.
        // The user has not chosen any value. So make
        // the summary display a default entry "Item A"
        // display name, which is item 0 in the 'entries' list. Info:
        // https://stackoverflow.com/questions/5197228/how-to-set-the-default-value-of-a-listpreference
        listPreference.setValueIndex(0);
    }
}

Для статических списков, которые заполнены <string-array>, просто убедитесь, что определено android:defaultValue="..." и что оно указывает на действительный элемент в массиве 'values'. Например: android:defaultValue="Item A Value"

Это обеспечит правильную работу android:summary="%s" для динамически генерируемых и статических списков.

...