2011-08-31 11 views
9
androide

i tiene una cadena en serie en mi res/valores/strings.xmlvalor Buscar clave en la cadena de matriz

<string-array name="my_list"> 
    <item>Item1</item> 
    <item>Item2</item> 
</string-array> 

estoy accediendo a ella en mi aplicación como y comparándolo con mi valor en el bucle .

String[] myStrings = getResources().getStringArray(R.array.my_list); 
for(int i=0;i<myStrings.length;i++) 
{ 
    System.out.println(myStrings[i]); 
} 

Ahora necesito la búsqueda de los elementos de acuerdo con la clave para obtener la respectiva item.Example

<string-array name="my_list"> 
    <item name="one">Item1</item> 
    <item name="two">Item2</item> 
</string-array> 

si mi clave de búsqueda del heno "uno" a continuación, obtener su valor correspondiente (Elemento1).

Cómo llevar a cabo esta tarea.

Gracias

Respuesta

8

Lo que tienes allí es un mapa como la estructura de datos. Lamentablemente, actualmente no hay forma de crear un Mapa de cadenas a través de XML como ese.

Puede hacerlo todo en Java o escribir su mapa en un archivo XML sin formato y leer/analizar eso en un mapa en tiempo de ejecución.

+0

Gracias C0deAttack. – Rishi

+0

¿Hay alguna manera ahora? ¿O seguiré siendo Triste? –

2

Tuve el mismo problema. La decisión para mí fue crear muchas cadenas en xml-file (no en matrices de cadenas) y crear String [] en el código. Se ve así:

Builder builder = new AlertDialog.Builder(DMCBrowser.this); 
    builder.setTitle(R.string.title_playlist); 
    final CharSequence[] items = new CharSequence[] { getResources().getString(R.string.watch_all), 
         getResources().getString(R.string.select_items) }; 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (items[which].equals(getResources().getString(R.string.watch_all))) { 
          Log.d(TAG, "Watch all"); 
         } else if (items[which].equals(getResources().getString(R.string.select_items))) { 
          Log.d(TAG, "Select items"); 
         } 
        } 
       }).show(); 

A pesar de que no se parece mucho compacta, podemos diferir uno de otro elemento, no sólo por el identificador no comprensibles como de 1 o 2, pero por legible androide R-id. Si me gustaría cambiar el orden del artículo, será muy fácil.

+0

Gracias por la respuesta Andrei. – Rishi

-1

Puede hacer que los recursos de la matriz de cadenas, como a continuación para mostrar como tipo HashMap:

<string-array name="list_websites"> 
     <item> 
      <string name="title">Amazon</string> 
      <string name="isChecked">0</string> 
     </item> 
     <item> 
      <string name="title">eBay</string> 
      <string name="isChecked">0</string> 
     </item> 
     <item> 
      <string name="title">Sam\'s Club</string> 
      <string name="isChecked">0</string> 
     </item> 
     <item> 
      <string name="title">Wallmart</string> 
      <string name="isChecked">0</string> 
     </item> 
     <item> 
      <string name="title">Best Buy</string> 
      <string name="isChecked">0</string> 
     </item> 
     <item> 
      <string name="title">Rekuten</string> 
      <string name="isChecked">0</string> 
     </item> 
</string-array> 

Ahora código anterior se puede analizar como ArrayList de HashMap tipo.

+4

¿Podría agregar un ejemplo de código sobre cómo analizar esto desde el archivo de recursos? Obtené matrices de cadenas vacías con lo siguiente utilizando su recurso de ejemplo: '' 'String [] config = context.getResources(). GetStringArray (R.array.list_websites);' '' – orbitbot

+0

La etiqueta no puede aparecer dentro de , solo

11

Bueno, lo he hecho usando dos matrices. Fácil de administrar también.

Uno de teclas:

<string-array name="codes"> 
     <item>AC</item> 
     <item>AD</item> 
     <item>AE</item> 
</string-array> 

Uno de Valores:

<string-array name="names"> 
     <item>Ascension</item> 
     <item>Andorra</item> 
     <item>United Arab Emirates</item> 
</string-array> 

Y el método de búsqueda.

private String getCountryByCode(String code) { 
     int i = -1; 
     for (String cc: getResources().getStringArray(R.array.codes)) { 
      i++; 
      if (cc.equals(code)) 
       break; 
     } 
     return getResources().getStringArray(R.array.names)[i]; 
    } 
2

Una buena forma de hacerlo es crear una matriz de matrices con XML como se muestra a continuación. Luego, las funciones nativas hacen que sea muy fácil obtener la matriz con el índice nombrado que desee y obtener la cadena dentro de ella.

<string-array name="one"> 
    <item>"Item 1"</item> 
</string-array> 

<string-array name="two"> 
    <item>"Item 2"</item> 
</string-array> 

<array name="my_list"> 
    <item>@array/one</item> 
    <item>@array/two</item> 
</array> 
7

Desafortunadamente no hay manera integrada para achive eso, sino que puede hacer algo así:

<string-array name="my_array"> 
     <item>key1|value1</item> 
     <item>key2|value2</item> 
    </string-array> 

y tienen una función util algo como:

Map<String, String> getKeyValueFromStringArray(Context ctx) { 
    String[] array = ctx.getResources().getStringArray(R.array.my_array); 
    Map<String, String> result = new HashMap<>(); 
    for (String str : array) { 
     String[] splittedItem = str.split("|"); 
     result.put(splittedItem[0], splittedItem[1]) 
    } 
    return result 
} 

Es parece un poco hacky, pero en general, porque tiene el control de su diccionario, probablemente no sea una idea tan horrible.

+0

+1. '|' -> '\\ |'. Como nota al margen, de vez en cuando uso algo como Guava [Splitter] (https://github.com/google/guava/wiki/StringsExplained#splitter) para evitar expresiones regulares adicionales para un caso tan simple. – aeracode

0

puede utilizar en código Java:

public static HashMap<Integer, String> getAll() 
{ 
      HashMap<Integer, String> items = new HashMap<Integer, String>(); 
      items.put(0, "item 1"); 
      items.put(1, "item 2"); 
      items.put(2, "item 3"); 
      return items; 
} 

public static Integer getKey(Map hm, String value) { 
      for (Object o : hm.keySet()) { 
       if (hm.get(o).equals(value)) { 
        return (Integer)o; 
       } 
      } 
      return 0; 
} 

y se unen a spinner:

Spinner spn_items = (Spinner) view.findViewById(R.id.spn_items); 
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(getActivity(),android.R.layout.simple_spinner_dropdown_item, getAll().values().toArray()); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spn_items.setAdapter(adapter); 
Cuestiones relacionadas