2016-11-01 18 views
0

xml配列からdrawable IDを取得したいが、文字列配列を使用していますが、これは可能ですか?アンドロイド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> 

"pic"をつかんで、後でヨガオブジェクトに入れたいと思っています。私はこれで十分だろうと思った(これは単なるスニペットで、全体のコードは、文字列値を取得する前に働いていた):そして、それはとり

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) 

を:

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

私はので、問題はスニペットである知っています私はストリングを整数に解析しようとしている行にまっすぐに行きます。並列配列を作成せずにこれを行う方法はありますか?

EDIT:フル方法

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)); 
     } 
    } 


} 

答えて

1

スタックトレースに基づいて、文字列値 "res/drawable-xhdpi-v4/yoga_adho_mukha_svanasana.png"を明らかに整数ではない整数に解析しようとしています。私はResourcesクラスが@ drawable/yoga_adho_mukha_svanasanaをあなたが期待しているIDに拡張しているとは思わない。現在の画面密度のリソースのファイルパスに展開しています。

リソースIDを取得しようとしている場合は、代わりにこれを実行してください。あなたの "写真"アイテムから "@ drawable /"を省略してください。そこに「/描画可能@」文字列としてPICを読み、連結、コードに続いて

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

とリソースに名前を変換するResources.getIdentifier()を呼び出します。その代わり、ちょうどこのような識別子部分を置きますIDは次のようになります。

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

これは少しハックです。 Drawableをロードしようとしているだけの場合は、本当にIDは必要なく、Nikoの答えはうまくいくように見えます。何を正確に達成しようとしていますか?

+0

あなたは私にとってはうまくいくようでしたが、picIDのためにすべて0を得ています。 Log.dで印刷しています。私はちょうど今この情報をカードビューに記入しようとしていますが、あなたのコードがうまくいくように見えたので、私が作業する必要がある何か他のものでしょう。 –

1

あなたのコードは、TypedArrayのより多くの機能については、この

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

ようにする必要があります代わりにgetStringArray()

obtainTypedArray()を使用する必要がありますdocumentationを参照してください。

+0

私はtypedarrayを使用していますが、あなたのバージョンで私にエラーが表示されています。もっと深く説明できますか?私は完全な方法の編集を投稿しました。 –

+0

@GerMexどこに何のエラーがありましたか? –

+0

Adrianus Yuwon TypedArray =/res.getStringArray(id);それは私に互換性のない型エラーを与えています。 res.obtainTypedArray(id)に変更し、sanName、pic、des、およびstepsのエラーを取得しています。それは "それは、スタイル可能な型の期待されるリソースです..."と言いますか? –

関連する問題