2012-04-17 10 views
16

Stavo cercando di definire una tabella di hash statica che faccia uso di risorse, ma sono stato messo a tacere dall'impossibilità di accedere alle risorse staticamente.

Poi ho capito che il migliore di tutti i posti per definire una mappa statica è nei file delle risorse stessi.

Come definire una mappa in XML? Credo che, se possibile, dovrebbe essere simile al meccanismo Listpreference, con voci e valori-voci.Android È possibile definire una mappa in un file XML?

+0

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

+0

Potete per favore farci un esempio quello che vorresti fare esattamente? – Blehi

+1

Blehi, voglio avere una mappa statica a cui posso accedere più volte da qualsiasi classe. Vorrei, idealmente, avere questo aspetto: ilomambo

risposta

24

Come definire una mappa in XML?

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

mettere questo in res/xml/, e caricarlo usando getResources().getXml(). Passa gli eventi per creare un HashMap<String, String>.

+1

Questo non è ciò di cui ho bisogno. In realtà, è la parte della tabella in XML. Ma non posso usare getResources() nel contesto statico in cui voglio costruire la mappa hash. – ilomambo

+2

@ilomambo: inizializza la tua mappa hash in 'onCreate()' di una sottoclasse 'Applicazione' personalizzata. Questo viene chiamato dopo che sono stati creati tutti i "ContentProviders", ma prima che venga eseguito qualsiasi altro aspetto della tua app. 'Application' è un' Context' e dovrebbe funzionare per analizzare questo XML. – CommonsWare

+0

@CommonsWare Grazie per la tua risposta, la userò.Ho bisogno di salvare una HashMap come file XML, come posso fare questo? Grazie. – VansFannel

29

Un'opzione più semplice sarebbe utilizzare due array. Questo ha il vantaggio di non iterare nuovamente il file xml, usa meno codice ed è più semplice usare array di tipi diversi.

<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> 

Allora il vostro codice Java sarebbe simile a questa:

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

È sempre possibile incorporare JSON dentro il file strings.xml:

res/valori/strings.xml

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

E all'interno della tua attività, puoi costruire la tua mappa nel metodo 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()); 
} 

Questo codice necessita di google-gson api per funzionare, è possibile farlo utilizzando l'API di json integrata nell'SDK di Android.

E per quanto riguarda l'accesso alla mappa in modo statico è possibile creare un metodo statico:

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 risposta corretta è stata menzionata da CommonsWare sopra, ma come XML-analisi non è così semplice, come a seguito di una semplice parser per questo scopo:

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

come ho scritto la risposta corretta è stata citata da Commonsware, era solo un'aggiunta. Ho pensato che non è utile copiare nuovamente la risposta di Commonsware nella mia risposta – Christian

Problemi correlati