Обновить EditText предпочтения в зависимости от изменения другого предпочтения - PullRequest
3 голосов
/ 03 марта 2011

Я хочу изменить значения , отображаемые в каждом Preference в моем PreferenceActivity, основываясь на изменении в другом предпочтении.

У меня есть приложение, которое хранит метрические (плавающие) значения в Preferences.У меня также есть Preference, называемый metric, где пользователь может переключаться между использованием метрических или британских единиц.

Я храню только значения метрик, но когда пользователь переключается на имперские, приложение отображает имперские значения.

Все работает нормально, если пользователь только переключает настройку метрики и оставляет PreferenceActivity.Когда он возвращается, значения отображаются в правильном направлении.Если он, например, смотрит на userHeight, то на дисплее все равно отображается значение метрики.

В моем PreferenceActivity я хочу обновить отображаемые значения, когда меняется предпочтение metric (я уверен, чточто, когда эти значения должны быть сохранены, они будут преобразованы обратно правильно):

this.metric.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final Boolean metric = Boolean.parseBoolean(newValue.toString());
        changeSummaries(metric);
        refreshDisplay(metric); 
        return true;
    }
});

Что я должен реализовать в методе refreshDisplay(...)?Было бы также полезно узнать, в какой момент жизненного цикла PreferenceActivity зафиксированы измененные значения?

1 Ответ

2 голосов
/ 03 марта 2011

Я нашел это.По крайней мере, для моей конкретной проблемы я нашел простое решение.

Я уже расширил EditTextPreference, чтобы иметь возможность хранить что-то отличное от String

Перед открытием диалогового окна onBindDialogViewметод вызывается в тот момент, когда другой измененный Preference фиксируется (сначала я подумал, что это может быть не так - быстрый тест показал, что я не прав).Простое переопределение onBindDialogView позволяет мне изменить отображаемое значение на то, которое я хочу отобразить:

@Override
protected void onBindDialogView(View view) {
    super.onBindDialogView(view);
    getEditText().setText(getPersistedString(""));
}

@Override
protected String getPersistedString(String defaultReturnValue) {
    final Float storedValue = getPersistedFloat(-1);
    Float returnValue;
    if (MyPreferences.isMetric(getContext())) {
        returnValue = storedValue;
    } else {
        returnValue = this.unit.convertToImperial(storedValue);
    }
    return String.valueOf(returnValue);
}
...