Как получить 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 ответа

Решение

Проблема двоякая:

  1. Вам необходимо указать название пакета в Resources.GetIdentifier() звоните, а не пользуйтесь null,
  2. Вам нужно использовать правильное имя пакета.

Простой способ убедиться, что вы получили правильное имя пакета, это использовать свойство 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()));
Другие вопросы по тегам