2012-04-17 13 views
16

Estaba tratando de definir una tabla hash estática que hace uso de los recursos, pero quedé bloqueado por la imposibilidad de acceder a los recursos estáticamente.

Luego me di cuenta de que lo mejor de todos los lugares para definir un mapa estático es en los propios archivos de recursos.

¿Cómo puedo definir un mapa en XML? Creo que, de ser posible, debería ser similar al mecanismo Listpreference, con entradas y valores de entradas.Android ¿Es posible definir un mapa en un archivo XML?

+0

cheque esta out..http:? //mobiforge.com/developing/story/using-google-maps-android dm_switcher = true – dreamcoder

+0

¿puede usted darnos un ejemplo lo que le gustaría hacer exactamente? – Blehi

+1

Blehi, quiero tener un mapa estático al que pueda acceder muchas veces desde cualquier clase. Me gustaría, idealmente, tener este aspecto: ilomambo

Respuesta

24

¿Cómo puedo definir un mapa en XML?

<thisIsMyMap> 
    <entry key="foo">bar</entry> 
    <entry key="goo">baz</entry> 
    <!-- as many more as your heart desires --> 
</thisIsMyMap> 

poner esto en res/xml/, y cargarlo usando getResources().getXml(). Siga los eventos para crear un HashMap<String, String>.

+1

Esto no es lo que necesito. En realidad, lo es, la parte de la tabla en XML. Pero no puedo usar getResources() en el contexto estático donde quiero construir el mapa hash. – ilomambo

+2

@ilomambo: Inicialice su mapa hash en 'onCreate()' de una subclase 'Application' personalizada. Eso se llama después de que se crea cualquier 'ContentProviders' que tengas, pero antes de que se ejecute cualquier otra cosa de tu aplicación. 'Application' es un' Context' y debería funcionar para analizar este XML. – CommonsWare

+0

@CommonsWare Gracias por su respuesta, lo usaré.Necesito guardar un HashMap como un archivo XML, ¿cómo puedo hacer esto? Gracias. – VansFannel

29

Una opción más simple sería utilizar dos matrices. Esto tiene la ventaja de no repetir el archivo xml de nuevo, utiliza menos código y es más sencillo utilizar matrices de diferentes tipos.

<string-array name="myvariablename_keys"> 
    <item>key1</item> 
    <item>key1</item> 
</string-array> 

<string-array name="myvariablename_values"> 
    <item>value1</item> 
    <item>value2</item> 
</string-array> 

A continuación, el código Java se vería así:

String[] keys = this.getResources().getStringArray(R.array.myvariablename_keys); 
String[] values = this.getResources().getStringArray(R.array.myvariablename_values); 
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>(); 
for (int i = 0; i < Math.min(keys.length, values.length); ++i) { 
    map.put(keys[i], values[i]); 
} 
9

Siempre se puede incrustar JSON dentro de su archivo strings.xml:

res/valores/strings.xml

<string name="my_map">{"F":"FOO","B":"BAR"}</string> 

Y dentro de su actividad, puede construir su mapa en el método onStart:

private HashMap<String, String> myMap; 

@Override 
protected void onStart() { 
    super.onStart(); 
    myMap = new Gson().fromJson(getString(R.string.my_map), new TypeToken<HashMap<String, String>>(){}.getType()); 
} 

Este código necesita la aplicación google-gson para funcionar, puede hacerlo utilizando la API incorporada en el sdk de Android.

y en cuanto a acceso a la asignación estática puede crear un método estático:

private static HashMap<String, String> method(Context context) { 
    HashMap<String, String> myMap = new Gson().fromJson(context.getString(R.string.serve_times), new TypeToken<HashMap<String, String>>(){}.getType()); 
    retrun myMap; 
} 
4

La respuesta correcta fue mencionado por CommonsWare arriba, pero como XML-análisis no es tan simple, ya que después de un analizador simple para con este fin:

public static Map<String, String> getHashMapResource(Context context, int hashMapResId) { 
    Map<String, String> map = new HashMap<>(); 
    XmlResourceParser parser = context.getResources().getXml(hashMapResId); 

    String key = null, value = null; 

    try { 
     int eventType = parser.getEventType(); 

     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG) { 
       if (parser.getName().equals("entry")) { 
        key = parser.getAttributeValue(null, "key"); 

        if (null == key) { 
         parser.close(); 
         return null; 
        } 
       } 
      } 
      else if (eventType == XmlPullParser.END_TAG) { 
       if (parser.getName().equals("entry")) { 
        map.put(key, value); 
        key = null; 
        value = null; 
       } 
      } else if (eventType == XmlPullParser.TEXT) { 
       if (null != key) { 
        value = parser.getText(); 
       } 
      } 
      eventType = parser.next(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return map; 
} 
+1

mientras escribía, la respuesta correcta fue mencionada por Commonsware, era solo una adición. Pensé que no era útil copiar la respuesta de Commonsware nuevamente en mi respuesta – Christian

Cuestiones relacionadas