2016-11-01 8 views
0

Je veux récupérer l'ID dessinable d'un tableau xml mais en utilisant le tableau de chaînes, est-ce possible?Chaîne mixte de type String et Integer pour XML XML?

<array name="yoga0"> 
    <item name="engName">Downward-Facing Dog</item> 
    <item name="sanName">Adho mukh a savanasana</item> 
    <item name="pic">@drawable/yoga_adho_mukha_svanasana</item> 
    <item name="description">foo</item> 
    <item name="steps">bar</item> 
</array> 
<array name="yoga1"> 
    <item name="engName">Fire Log Pose</item> 
    <item name="sanName">Agnistambhasana</item> 
    <item name="pic">@drawable/yoga_agnistambhasana</item> 
    <item name="description">bar</item> 
    <item name="steps">foo</item> 
</array> 

Je veux saisir "pic" et le mettre dans un objet de yoga plus tard. Je pensais que cela suffit (ce qui est juste un extrait, tout le code a travaillé avant d'obtenir des valeurs de chaîne uniquement):

String[] handle; 
handle = res.getStringArray(id); 
String engName = handle[0]; //Access items in your XML array 
String sanName = handle[1]; 
int pic = Integer.parseInt(handle[2]); 
String description = handle[3]; 
String steps = handle[4]; 

Je sais que le problème est dans l'extrait parce que:

java.lang.NumberFormatException: Invalid int: "res/drawable-xhdpi-v4/yoga_adho_mukha_svanasana.png" 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Et il faut moi directement à la ligne où j'essaye d'analyser la chaîne dans un nombre entier. Y at-il un moyen que je peux le faire sans faire des tableaux parallèles?

EDIT: Méthode complète

private void getYogaArray() { 

    Resources res = getResources(); 
    TypedArray index = res.obtainTypedArray(R.array.yogas); //call the index array 
    for (int i = 0; i < index.length(); i++) { 
     int id = index.getResourceId(i, 0); //get the index 
     if (id != 0) { 
      String[] handle; 
      handle = res.getStringArray(id); //use the index to get the actual array 
      String engName = handle[0]; //Access items in your XML array 
      String sanName = handle[1]; 
      int pic = Integer.parseInt(handle[2]); 
      String description = handle[3]; 
      String steps = handle[4]; 

      //create object and add to array list 
      yogaArrayList.add(i, new Yoga(engName, sanName, pic, description, steps)); 
     } 
    } 


} 

Répondre

1

Basé sur la trace de la pile, il essaie d'analyser la valeur de la chaîne "res/drawable-xhdpi-v4/yoga_adho_mukha_svanasana.png" en un entier qui n'est évidemment pas un nombre entier. Je ne pense pas que la classe Resources étend @ drawable/yoga_adho_mukha_svanasana à un ID comme vous vous y attendez. Il l'étend au chemin de fichier de la ressource pour la densité d'écran actuelle.

Si vous essayez d'obtenir l'ID de ressource, faites-le à la place. Omettez "@ drawable /" de vos éléments "pic". Au lieu de cela, il suffit de mettre la partie identifiant comme ceci:

<item name="pic">yoga_agnistambhasana</item> 

Ensuite, dans le code, lisez pic comme une chaîne et puis concaténer « @ drawable/» pour appeler et Resources.getIdentifier() pour convertir le nom d'une ressource ID comme ceci:

String pic = handle[2]; 
int picID = res.getIdentifier("@drawable/" + pic, null, null); 

Ceci est un peu de hack. Si vous essayez juste de charger le Drawable alors vous n'avez pas vraiment besoin de l'ID et la réponse de Niko semble que ça pourrait marcher. Qu'essayez-vous d'accomplir exactement?

+0

Le vôtre semblait fonctionner pour moi, mais je reçois tous les 0 pour le picID. Je les imprime avec Log.d. J'essaye juste de remplir une vue de carte avec cette information en ce moment, mais puisque votre code a semblé fonctionner c'est probablement quelque chose que je dois travailler dessus. –

1

Vous devez utiliser obtainTypedArray() au lieu de getStringArray()

Votre code devrait être comme ça

TypedArray handle = res.obtainTypedArray(id); 
String engName = handle.getString(0); 
String sanName = handle.getString(1); 
Drawable pic = handle.getDrawable(2); 
String description = handle.getString(3); 
String steps = handle.getString(4); 

Pour plus fonction de TypedArray s'il vous plaît voir le documentation

+0

J'utilise typedarray et votre version me donne des erreurs, pouvez-vous expliquer plus en profondeur? J'ai posté une modification de ma méthode complète. –

+0

@GerMex Où et quelle erreur avez-vous eu? –

+0

Adrianus Yuwon TypedArray =/= res.getStringArray (id); ça me donne une erreur de type incompatible. Je l'ai changé en res.obtainTypedArray (id) et j'obtiens des erreurs pour sanName, pic, des., Et des étapes. Il dit "C'est une ressource attendue de type styleable ..."? –