2011-06-14 15 views
6

Estoy intentando que funcione una subclase de Preferencias existente que ahorre un valor de color. No escribí la clase, pero se supone que está trabajando en android-7 y superior (estoy compilando para un destino android-9). El código fuente completo es available here. Aquí es donde se guarda la preferencia:Valor de preferencia personalizado de Android no guardado

@Override 
public void onColorChanged(int color) { 
    if (isPersistent()) { 
     boolean ret = persistInt(color); 
    } 
    // (update preview box, other stuff) 
} 

Uso de la salida de depuración que puede decir que isPersistent() vuelve true, pero persistInt() vuelve false. De acuerdo con Android documentation, persistInt() devuelve si la preferencia es persistente; ¿Cómo pueden estos devolver diferentes valores? (Nota: setPersistent(true) se llama explícitamente desde el constructor.)

En cualquier caso, el valor no se guarda. Una llamada al getPersistedInt(defaultValue) devuelve el valor predeterminado, incluso más adelante en la misma instancia de la clase. En el código siguiente, siempre se llama a getPersistedInt() y siempre devuelve mDefaultValue.

public int getValue() { 
    try { 
     if (isPersistent()) { 
      mValue = getPersistedInt(mDefaultValue); 
     } 
    } catch (ClassCastException e) { 
     mValue = mDefaultValue; 
    } 

    return mValue; 
} 

¿Por qué es esto y cómo puedo asegurarme de que la preferencia se mantenga?

+0

Fwiw, aquí hay un proyecto mío con un widget 'ColorMixer', también empaquetado como una' ColorPreference': https://github.com/commonsguy/cwac-colormixer – CommonsWare

+0

Gracias por el enlace, Miré el suyo pero decidí no hacerlo, porque aunque los controles deslizantes RGB pueden ser útiles para teléfonos sin pantalla táctil, mi aplicación requiere una pantalla táctil de todos modos, y preferiría algún tipo de selector de HSL. – tmandry

Respuesta

8

Después de muchas búsquedas sin remedio, finalmente encontré el problema: al valor de preferencia no se le asignó una clave, debido a un simple error en mi archivo XML de preferencias. (Utilicé android.key en lugar de android:key.)

Dado que Android no le advierte cuando se trata de persistir una preferencia que no tiene clave (pero en silencio falla en cambio,) debe llamar a la función shouldPersist() en lugar de isPersistent() antes de tratar de persistir un valor, y tal vez registrar una advertencia si shouldPersist() devuelve falso. Por ejemplo:

@Override 
public void onColorChanged(int color) { 
    mValue = color; 
    if (shouldPersist()) { 
     persistInt(color); 
    } else { 
     if (isPersistent()) 
      Log.w("myapp", "shouldPersist() returned false. Check if this preference has a key."); 
    } 
    // (update preview box, other stuff) 
} 
+0

tuvo el mismo problema pasó horas en eso gracias – Michal

Cuestiones relacionadas