尝试从 Android 中的名称获取可绘制资源 ID
Trying to get drawable resource ID from its name in Android
我有这样一个资源文件:
strings.xml
<string name="category01">My Category 01</string>
<string name="category02">My Category 02</string>
<string name="category03">My Category 03</string>
<string-array name="array_category_01">
<item name="title">@string/category01</item>
<item name="image">@drawable/img01</item>
</string-array>
<string-array name="array_category_02">
<item name="title">@string/category02</item>
<item name="image">@drawable/img02</item>
</string-array>
<string-array name="array_category_03">
<item name="title">@string/category03</item>
<item name="image">@drawable/img03</item>
</string-array>
<string-array name="categories_array">
<item>@array/array_category_01</item>
<item>@array/array_category_02</item>
<item>@array/array_category_03</item>
</string-array>
注意:@drawable/img01、@drawable/img02和@drawable/img03是png图片,位于res\drawable文件夹
稍后我执行以下迭代来检索类别图像对:
Resources res = this.context.getResources();
TypedArray ta = res.obtainTypedArray(R.array.categories_array);
int n = ta.length();
String[][] array = new String[n][];
for (int i = 0; i < n; ++i) {
int id = ta.getResourceId(i, 0);
if (id > 0) {
array[i] = res.getStringArray(id);
} else {
// something wrong with the XML
}
}
ta.recycle();
所以例如最后我得到一个数组,其内容是:
array[0]
|
---> [0] "My Category 01"
|
---> [1] "res/drawable-xxhdpi-v4/img01.png"
array[1]
|
---> [0] "My Category 02"
|
---> [1] "res/drawable-xxhdpi-v4/img02.png"
array[2]
|
---> [0] "My Category 03"
|
---> [1] "res/drawable-xxhdpi-v4/img03.png"
这正是我期望得到的,到这里没问题。
稍后在我的代码中,我需要获取上述数组中包含的类别之一的资源 ID,以便设置 ImageView 对象的内容,因此我在下面执行(假设我想要类别的图像2):
ImageView imageView = (ImageView) rowView.findViewById(R.id.categoryicon);
int resID = this.context.getResources().getIdentifier(array[1][1] , "drawable", this.context.getPackageName());
imageView.setImageResource(resID);
我的问题是 resID 为零,这意味着未找到可绘制资源...
为了工作,我需要 数组 中的图像名称为 img01、img02、img03 而不是 "res/drawable-xxhdpi-v4/img01.png"、"res/drawable-xxhdpi-v4/img02.png" 和 "res/drawable-xxhdpi-v4/img03.png" 分别所以当我通过 array[x][y] 将名称传递给 getIdentifier 时它起作用了。
我怎样才能摆脱这个?
array[1][1] 是资源的路径。您必须指定 name.See http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29
一个简单的解决方案是解析字符串并仅获取图像名称,如下所示。
String[] Image1 = array[1][1].split("/");
String s = Image1[Image1.length-1].replace(".png","").trim();
int resID = this.context.getResources().getIdentifier(s , "drawable", this.context.getPackageName());
我有这样一个资源文件:
strings.xml
<string name="category01">My Category 01</string>
<string name="category02">My Category 02</string>
<string name="category03">My Category 03</string>
<string-array name="array_category_01">
<item name="title">@string/category01</item>
<item name="image">@drawable/img01</item>
</string-array>
<string-array name="array_category_02">
<item name="title">@string/category02</item>
<item name="image">@drawable/img02</item>
</string-array>
<string-array name="array_category_03">
<item name="title">@string/category03</item>
<item name="image">@drawable/img03</item>
</string-array>
<string-array name="categories_array">
<item>@array/array_category_01</item>
<item>@array/array_category_02</item>
<item>@array/array_category_03</item>
</string-array>
注意:@drawable/img01、@drawable/img02和@drawable/img03是png图片,位于res\drawable文件夹
稍后我执行以下迭代来检索类别图像对:
Resources res = this.context.getResources();
TypedArray ta = res.obtainTypedArray(R.array.categories_array);
int n = ta.length();
String[][] array = new String[n][];
for (int i = 0; i < n; ++i) {
int id = ta.getResourceId(i, 0);
if (id > 0) {
array[i] = res.getStringArray(id);
} else {
// something wrong with the XML
}
}
ta.recycle();
所以例如最后我得到一个数组,其内容是:
array[0]
|
---> [0] "My Category 01"
|
---> [1] "res/drawable-xxhdpi-v4/img01.png"
array[1]
|
---> [0] "My Category 02"
|
---> [1] "res/drawable-xxhdpi-v4/img02.png"
array[2]
|
---> [0] "My Category 03"
|
---> [1] "res/drawable-xxhdpi-v4/img03.png"
这正是我期望得到的,到这里没问题。
稍后在我的代码中,我需要获取上述数组中包含的类别之一的资源 ID,以便设置 ImageView 对象的内容,因此我在下面执行(假设我想要类别的图像2):
ImageView imageView = (ImageView) rowView.findViewById(R.id.categoryicon);
int resID = this.context.getResources().getIdentifier(array[1][1] , "drawable", this.context.getPackageName());
imageView.setImageResource(resID);
我的问题是 resID 为零,这意味着未找到可绘制资源...
为了工作,我需要 数组 中的图像名称为 img01、img02、img03 而不是 "res/drawable-xxhdpi-v4/img01.png"、"res/drawable-xxhdpi-v4/img02.png" 和 "res/drawable-xxhdpi-v4/img03.png" 分别所以当我通过 array[x][y] 将名称传递给 getIdentifier 时它起作用了。
我怎样才能摆脱这个?
array[1][1] 是资源的路径。您必须指定 name.See http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29
一个简单的解决方案是解析字符串并仅获取图像名称,如下所示。
String[] Image1 = array[1][1].split("/");
String s = Image1[Image1.length-1].replace(".png","").trim();
int resID = this.context.getResources().getIdentifier(s , "drawable", this.context.getPackageName());