Идентификатор текстового текста Android по строке [дубликат]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

139
задан Jonik 18 February 2014 в 19:09
поделиться

8 ответов

Это будет что-то вроде:

R.drawable.resourcename

Убедитесь, что вы не импортировали пространство имен Android.R, поскольку оно может запутать Eclipse (если это то, re использование).

Если это не работает, вы всегда можете использовать метод контекста getResources ...

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

Если this.context инициализируется как Activity, Service или любой другой подкласс Context.

Обновление:

Если это ваше имя, класс Resources (возвращенный getResources()) имеет getResourceName(int) метод и getResourceTypeName(int)?

Обновление 2:

Класс Resources имеет этот метод:

public int getIdentifier (String name, String defType, String defPackage) 

Который возвращает целое число имя указанного ресурса, тип & amp; пакет.

118
ответ дан Rabid 19 August 2018 в 03:14
поделиться
  • 1
    Thankq для вашего ответа .R.drawable.resourcename, я использую теперь, мне нужно получить его целочисленное значение, передав имя ресурса – Aswan 13 August 2010 в 12:45
  • 2
    R.drawable.resourcename является целым числом. – Rabid 13 August 2010 в 12:46
  • 3
    Привет Rabid.What вы сказали, что есть какой-либо способ, обратившись к R.drawable .resource value, передав resouce – Aswan 13 August 2010 в 12:47
  • 4
    Мне нужно это целочисленное значение, динамически передавая имя ресурса – Aswan 13 August 2010 в 12:48
  • 5
    Thankq, как это, я хочу, и я хочу получить ресурс id.how, – Aswan 13 August 2010 в 12:57

Если я правильно понял, это то, что вы хотите

int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());

Где «это» - это действие, написанное только для уточнения.

Если вы хотите, чтобы строка в strings.xml или идентификатор элемента пользовательского интерфейса, замените «drawable»

int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());

Предупреждаю, этот способ получения идентификаторов очень медленный, используйте только там, где это необходимо.

Ссылка на официальную документацию: Resource.getIdentifier (String name, String defType, String defPackage)

290
ответ дан Artyom 19 August 2018 в 03:14
поделиться
  • 1
    Это очень полезно в контексте написания тестов, чтобы убедиться, что существуют определенные строки или т. Д. – Ehtesh Choudhury 1 May 2015 в 22:14
  • 2
    Я не знаю человека, я добавил журнал до и после getIdentifier () с меткой времени, и он показал мне, что он выполняется в 0 - 1 мс! Так что это не медленно, это супер быстро! Я использую его для получения изображений из ресурсов, и он отлично работает. Протестировано на Nexus5x. – Kirill Karmazin 25 April 2017 в 21:16
  • 3
    @KirillKarmazin: Nexus5X - довольно быстрый телефон, а 1 мс для такого звонка довольно медленный. Помните, что каждый кадр пользовательского интерфейса составляет всего 16 мс. – Mooing Duck 15 August 2018 в 21:22

в дополнение к @lonkly solution

  1. см. отражения и доступность поля
  2. ненужные переменные

метод:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с)
                     throws android.content.res.Resources.NotFoundException {
    try {
        // lookup field in class 
        java.lang.reflect.Field field = с.getField(variableName);
        // always set access when using reflections  
        // preventing IllegalAccessException   
        field.setAccessible(true);
        // we can use here also Field.get() and do a cast 
        // receiver reference is null as it's static field 
        return field.getInt(null);
    } catch (Exception e) {
        // rethrow as not found ex
        throw new Resources.NotFoundException(e.getMessage());
    }
}
0
ответ дан ceph3us 19 August 2018 в 03:14
поделиться

Я бы предложил вам использовать мой метод для получения идентификатора ресурса. Это намного эффективнее, чем метод getIdentidier (), который медленный.

Вот код:

/**
 * @author Lonkly
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с) {

    Field field = null;
    int resId = 0;
    try {
        field = с.getField(variableName);
        try {
            resId = field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resId;

}
11
ответ дан cricket_007 19 August 2018 в 03:14
поделиться
  • 1
    Это не будет работать для всех случаев. Например, если у вас есть & lt; string name = & quot; string.name & quot; & gt; content & lt; / string & gt; чем класс R.string будет иметь поле string_name. И ваш метод не будет работать в этом вопросе. – ddmytrenko 22 October 2013 в 15:32
  • 2
    Также ваш метод на самом деле не быстрый. Поскольку сериализация классов Java никогда не работает быстро. – ddmytrenko 23 October 2013 в 11:39
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
22
ответ дан DaveShaw 19 August 2018 в 03:14
поделиться
  • 1
    Было бы лучше, если бы вы объяснили код, который вы опубликовали. – user 21 October 2012 в 02:11

Я нашел этот класс очень полезным для обработки ресурсами. Он имеет некоторые определенные методы для работы с размерами, цветами, рисунками и строками, такими как этот:

public static String getString(Context context, String stringId) {
    int sid = getStringId(context, stringId);
    if (sid > 0) {
        return context.getResources().getString(sid);
    } else {
        return "";
    }
}
0
ответ дан Diego Malone 19 August 2018 в 03:14
поделиться
0
ответ дан aminography 30 October 2018 в 14:55
поделиться
11
ответ дан cricket_007 30 October 2018 в 14:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: