Pergunta

Estou tentando construir minha preferência usando fragmentos. Eu tenho um preferências que contêm duas peças de seleção:

<CheckBoxPreference
    android:key="pref_bfp_scale"
    android:title="@string/PREF_BFP_scale_title"
    android:defaultValue="false" />
<CheckBoxPreference
    android:key="pref_bfp_navy"
    android:title="@string/PREF_BFP_navy_title"
    android:defaultValue="true" />

Minha atividade de fragmentação:

public class FragmentSettingsActivity extends PreferenceActivity {

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

    public static class BodyFatPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_body_fat);
            bindPrefSumtoValListener(findPreference("pref_bfp_scale"), "Boolean");
            bindPrefSumtoValListener(findPreference("pref_bfp_navy"), "Boolean");
        }
    }

    private static Preference.OnPreferenceChangeListener prefSumtoValListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();
            log("Pref changed - Value: " + stringValue);

            if (preference instanceof CheckBoxPreference) {
                Map<String, Integer> checkboxes = new HashMap<String, Integer>();

                checkboxes.put("pref_bfp_navy_unchecked", R.string.PREF_BFP_navy_summary_unchecked);
                checkboxes.put("pref_bfp_navy_checked", R.string.PREF_BFP_navy_summary_checked);
                checkboxes.put("pref_bfp_scale_unchecked", R.string.PREF_BFP_scale_summary_unchecked);
                checkboxes.put("pref_bfp_scale_checked", R.string.PREF_BFP_scale_summary_checked);

                log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
                log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));

                preference.setSummary(checkboxes.get(String.format("%s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked")));
            }

            return true;

        }
    };

    private static void bindPrefSumtoValListener(Preference preference, String type) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(preference.getContext());

        preference.setOnPreferenceChangeListener(prefSumtoValListener);

        if (type.equals("Boolean")) {
            prefSumtoValListener.onPreferenceChange(preference, sharedPreferences.getBoolean(preference.getKey(), false));
        }
    }
}

A primeira chamada de OnPreferenceChange define o resumo corretamente, mas todas as outras chamadas definem o resumo contrário: se a caixa for verificada, o resumo "desmarcado" será definido e vice -versa.

Parece que o isCHECKED () retorna algum tipo de valor errado, pois o valor.ToString () retorna o estado correto como uma string.

LOG () Imprima:

log("Pref changed - Value: " + stringValue);
    //Output: Pref changed - Value: true
log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
    //Output: false
log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));
    //Output: ? : pref_bfp_navy_unchecked

Onde está meu erro?

Foi útil?

Solução

De OnPreferenceChangelistener documentos:

Retorna
Fiel para atualizar o estado da preferência com o novo valor.

O que pode ser coletado disso é que o valor da preferência não muda até que o ouvinte retorne verdadeiro. Em outras palavras, o newValue parâmetro de onPreferenceChange() É o que será o valor, mas não o que ainda é atualmente (porque sua verificação de log está dentro do ouvinte, antes que o True seja devolvido).

Em uma nota lateral, acho que o objetivo disso é para que você possa rejeitar uma alteração inválida para uma preferência. Por exemplo, se a preferência era uma string e é desejada que ela aceite apenas seqüências de uma certa variedade de valores aceitos, o dev pode rejeitar a mudança retornando falsa em onPreferenceChange().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top