2010-05-18 17 views
43

Cuando creo actividad de preferencia, defino todas las preferencias en el archivo xml. Cada preferencia tiene una clave definida en este xml. Pero cuando accedo a la preferencia que escribo:Dónde almacenar las claves de preferencia de Android?

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
boolean foo_value = appPreferences.getBoolean("foo_key_defined_in_xml", false); 

¿Hay alguna manera de evitar la referencia a "foo_key_defined_in_xml" en forma codificada? ¿Quizás hay una posibilidad de referenciarlo en estilo R (no para referirse a la cadena)?

Respuesta

59

que he encontrado que es posible almacenar las claves en strings.xml y se refieren a los mismos desde preferences.xml al igual que todos los demás valores android:key="@string/preference_enable".

En el código se puede hacer referencia a la clave tecleando getString(R.string.preference_enable)

Puede marcar la cadena a no ser traducido usando una etiqueta <xliff:g>. Ver Localization Checklist

<string name="preference_enable"><xliff:g id="preference_key">enable</xliff:g></string> 
+1

Esta es la mejor manera, ya que le permite cambiar la clave en un solo lugar y se propagará a la página de configuración y a cualquier lugar al que haga referencia en el código. –

+5

No recomendaría esto porque cuando admite archivos XML de múltiples idiomas, la cadena clave también puede traducirse inadvertidamente. –

+16

Bueno, debe guardar esas claves en un archivo diferente que solo contenga valores estáticos y ninguna traducción. – Hameno

0

Por lo que sé, no hay mejor forma de referenciar las claves de preferencia (aparte de quizás usar una cadena estática final para almacenar la cadena en la clase).

El example dado en la documentación del SDK hace lo mismo que lo que se ha dado en su ejemplo,

+0

Así es como me gusta hacerlo. De esta manera, cuando crea una nueva clave, en el mismo archivo en el que la creó, hay una referencia de String final pública estática disponible para cualquier clase que pueda necesitar referenciarla. –

1

Trate getString(R.string.key_defined_in_xml).

+0

No funciona. Los valores de 'android: key' no se almacenan en esta clase. – scai

1

¿Qué pasa con el uso de una clase de ayuda para ocultar el getString() - una instancia del ayudante de una vez en cada actividad o servicio. Por ejemplo:

class Pref { 

    final String smsEnable_pref; 
    final String interval_pref; 
    final String sendTo_pref; 
    final String customTemplate_pref; 
    final String webUrl_pref; 

    Pref(Resources res) {  
     smsEnable_pref = res.getString(R.string.smsEnable_pref); 
     interval_pref = res.getString(R.string.interval_pref); 
     sendTo_pref = res.getString(R.string.sendTo_pref); 
     customTemplate_pref = res.getString(R.string.customTemplate_pref); 
     webUrl_pref = res.getString(R.string.webUrl_pref); 
    } 
} 
+0

No estoy seguro de lo que ddcruver significa por __Even si define un resoure en /res/values/string.xml para mantener este nombre de clave no puede usar eso en el android: key = "key_name" .__ Como Pixel escribió, puede hacer android: key = "@ string/preference_key ". Tal vez me estoy perdiendo algo. –

7

Se puede usar un "keys.xml archivos" en "res/valores", pero debe poner algo así, de esta manera usted debe no tienen problema cuando está utilizando varios idiomas:

<resources 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:ignore="MissingTranslation"> 

    <string name="key1">key1</string> 
    <string name="key2">key2</string> 
... 
</resources> 

Posteriormente, se podría hacer referencia a ella como una cadena normal en el xml:

.... 
android:key="@string/key1" 
.... 

o en su código de java, por ejemplo:

SwitchPreference Pref1= (SwitchPreference) getPreferenceScreen().findPreference(getString(R.string.key1)); 
+2

Me gusta más que la respuesta aceptada porque es más limpia (y en realidad se sugiere en los comentarios a esa respuesta). Desafortunadamente, el espacio de nombres "string /" aún estará contaminado tanto con las cadenas reales como con las teclas de preferencia; tendrá que usar un prefijo para resolverlo de una forma agradable. –

Cuestiones relacionadas