Как получить Resource.Id из значения?
У меня есть изображение (my_image.png) в папке Drawable-mdpi.
мое приложение для Android взаимодействует с веб-сервисом. Это может отправить обратно "my_image". Мое приложение для Android должно загрузить это изображение.
Я использую Monodroid, и я попробовал это
int abc = Resources.GetIdentifier("my_image","drawable",null);
И все же результат всегда "0"
, Когда это должно быть (из файла ресурсов)
// aapt resource value: 0x7f020000
public const int my_image = 2130837504;
Оглядываясь вокруг, android way кажется похожим
int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName());
Я попытался передать имя пакета вместо null
но это ничего не сделало.
3 ответа
Проблема двоякая:
- Вам необходимо указать название пакета в
Resources.GetIdentifier()
звоните, а не пользуйтесьnull
, - Вам нужно использовать правильное имя пакета.
Простой способ убедиться, что вы получили правильное имя пакета, это использовать свойство http://docs.mono-android.net/index.aspx?link=P%3AAndroid.Content.Context.PackageName:
int id = Resources.GetIdentifier ("my_image", "drawable", PackageName);
Если вы не хотите / не можете использовать Context.PackageName
, затем посмотрите на результат сборки, например, в obj\Debug\android\AndroidManifest.xml
файл, и используйте значение /manifest/@package
значение атрибута. Например, AndroidManifest.xml
может содержать:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="MonoAndroidApplication2.MonoAndroidApplication2">
<!-- ... -->
</manifest>
Таким образом, вы могли бы вместо этого использовать:
int id = Resources.GetIdentifier ("my_image", "drawable",
"MonoAndroidApplication2.MonoAndroidApplication2");
За monodroid@lists.ximian.com
подписчики, см. Как использовать поток Resources.GetIdentifier() и последующее сообщение.
Вам просто нужно правильно отформатировать ваш запрос:
Вместо:
int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName());
Пытаться:
int i = getResources().getIdentifier("[fully qualified package]:drawable/[resource name]", null, null);
Таким образом, для Resource
"my_image" в пакете "com.example" будет выглядеть так:
int i = getResources().getIdentifier("com.example:drawable/my_image", null, null);
ОБНОВЛЕНИЕ: я также проверил, что следующие работы формируют меня (включая строки журнала, которые доказывают это:
int i = getResources().getIdentifier(
getPackageName() + ":drawable/" + resource_name, null, null);
Log.d("EXAMPLE", "Just making sure that these IDs match: '" + i + "' == '" + R.drawable.resource_name + "'.");
Это также может быть отформатировано, как вы сделали выше, что, как я полагаю, я указал на вашу ошибку: int i = getResources(). GetIdentified(resource_name, "drawable", getPackageName());
Для рессорса строк я делаю так:
String s = "nameToFetch";
String text = getString(getResources().getIdentifier("str_" + s, "string", getPackageName()));
Поэтому я думаю, что для вашего ничья вы должны позвонить:
String s = "nameToFetch";
Drawable drawable = getDrawable(getResources().getIdentifier("d_" + s, "drawable", getPackageName()));