Hacer referencia a una cadena en un recurso de matriz de cadena con xml

Tengo preferencias donde puede habilitar / deshabilitar qué elementos aparecerán en el menú. Hay 17 artículos. Hice una matriz de cadenas en values ​​/ arrays.xml con títulos para cada uno de estos 17 elementos.

Tengo preferences.xml que tiene el diseño para mi archivo de preferencias, y me gustaría hacer referencia a un solo elemento de la matriz de cadenas para usar como título.

¿Cómo puedo hacer esto?

En la referencia de desarrollador de Android, veo cómo puedo hacer referencia a una sola cadena con XML, pero no cómo puedo hacer referencia a una cadena desde un recurso de matriz en XML.

En resumen: no creo que puedas, pero parece haber una solución alternativa:.

Si echas un vistazo al Recurso de Android aquí:

http://developer.android.com/guide/topics/resources/string-resource.html

Verá que debajo de la sección de matriz (matriz de cadena, al menos), la “REFERENCIA DE RECURSO” (como se obtiene de un XML) no especifica una manera de abordar los elementos individuales. Incluso puede intentar en su XML usar “@ array / yourarrayhere”. Sé que en tiempo de diseño obtendrás el primer artículo. Pero eso no tiene ningún uso práctico si quieres usar, digamos … el segundo, por supuesto.

SIN EMBARGO, hay un truco que puedes hacer. Mira aquí:

Hacer referencia a una cadena XML en una matriz XML (Android)

Puede “engañar” (no realmente) la definición de la matriz al direccionar cadenas independientes DENTRO de la definición de la matriz. Por ejemplo, en tus strings.xml:

Earth Moon  @string/earth @string/moon  

Al usar esto, puedes usar “@ string / earth” y “@ string / moon” normalmente en tus campos “android: text” y “android: title” XML, y aún así no perderás la habilidad de usar el array definición para cualquier propósito que quisieras en primer lugar.

Parece que funciona aquí en mi Eclipse. ¿Por qué no tratas de decirnos si funciona? 🙂

Quizás esto ayude:

 String[] some_array = getResources().getStringArray(R.array.your_string_array) 

Entonces obtienes la lista de arreglos como un String [] y luego elijo i, some_array [i].

La mejor opción sería simplemente usar la matriz de retorno de recursos como una matriz, lo que significa:

getResources().getStringArray(R.array.your_array)[position]

Este es un enfoque de acceso directo de los enfoques mencionados anteriormente pero hace el trabajo de la manera que desea. De lo contrario, Android no proporciona indexación XML directa para matrices basadas en xml.

Desafortunadamente:

  • Parece que no se puede hacer referencia a un solo elemento de una matriz en values ​​/ arrays.xml con XML. Por supuesto que puedes hacerlo en Java, pero no en XML. No hay información sobre cómo hacerlo en la referencia del desarrollador de Android, y no pude encontrar ninguna otra parte.

  • Parece que no puede usar una matriz como clave en el diseño de preferencias. Cada clave tiene que ser un valor único con su propio nombre de clave.

Lo que quiero lograr: quiero ser capaz de recorrer las 17 preferencias, verificar si el ítem está marcado, y si lo está, cargar la cadena de la matriz de cadenas para ese nombre de preferencia.

Aquí está el código que esperaba que completara esta tarea:

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); ArrayAdapter itemsArrayList = new ArrayAdapter(getBaseContext(), android.R.layout.simple_list_item_1); String[] itemNames = getResources().getStringArray(R.array.itemNames_array); for (int i = 0; i < 16; i++) { if (prefs.getBoolean("itemKey[i]", true)) { itemsArrayList.add(itemNames[i]); } } 

Lo que hice:

  • Establecí una sola cadena para cada uno de los elementos, y hice referencia a las cadenas individuales en el. Utilizo la referencia de cadena única para los títulos de checkbox de disposición de preferencias y la matriz para mi ciclo.

  • Para recorrer las preferencias, acabo de nombrar las teclas como key1, key2, key3, etc. Como hace referencia a una clave con una cadena, tiene la opción de "comstackr" el nombre de la clave en tiempo de ejecución.

Aquí está el nuevo código:

 for (int i = 0; i < 16; i++) { if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) { itemsArrayList.add(itemNames[i]); } } 

Otra forma de hacerlo es definir una matriz de recursos en strings.xml como a continuación.

      ]> 

y luego definiendo una matriz de cadenas usando los recursos anteriores

  &supportDefaultSelection; &issueOption1; &issueOption2; &issueOption3;  

También puede referir la misma cadena a otras xmls manteniendo intacto DRY. La ventaja que veo es que con un único cambio de valor afectaría todas las referencias en el código.