Android, получить идентификатор ресурса из строки?

Мне нужно передать идентификатор ресурса в метод в одном из моих классов. Он должен использовать как идентификатор, на который указывает ссылка, так и строку. Как мне лучше всего достичь этого?

Например:

R.drawable.icon

Мне нужно получить целочисленный идентификатор этого, но мне также нужен доступ к строке «значок».

Было бы предпочтительнее, если бы все, что мне пришлось передать методу, это строка "icon".

вопрос задан 13.12.2010
Hamid
2184 репутация

13 ответов


  • 136 рейтинг

    @EboMike: я не знал, что существует Resources.getIdentifier().

    В своих проектах я использовал для этого следующий код:

    public static int getResId(String resName, Class
     c) {
    
        try {
            Field idField = c.getDeclaredField(resName);
            return idField.getInt(idField);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } 
    }
    

    Это будет использоваться для получения значения целого значения ресурса R.drawable.icon

    int resID = getResId("icon", R.drawable.class); // or other resource class
    

    Я только что нашел сообщение в блоге, говорящее, что Resources.getIdentifier() медленнее, чем использование отражения, как я сделал. Проверьте это .

    ответ дан Macarse, с репутацией 60274, 13.12.2010
  • 64 рейтинг

    Вы можете использовать эту функцию для получения идентификатора ресурса.

    public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
    {
        try {
            return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } 
    }
    

    Так что если вы хотите получить для рисования функции вызова, как это

    getResourceId("myIcon", "drawable", getPackageName());
    

    и для строки вы можете назвать это так

    getResourceId("myAppName", "string", getPackageName());
    

    Читать

    ответ дан Azhar, с репутацией 12267, 30.09.2013
  • 35 рейтинг

    Это основано на ответе @Macarse.

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

    public static int getId(String resourceName, Class
     c) {
        try {
            Field idField = c.getDeclaredField(resourceName);
            return idField.getInt(idField);
        } catch (Exception e) {
            throw new RuntimeException("No resource ID found for: "
                    + resourceName + " / " + c, e);
        }
    }
    

    Пример:

    getId("icon", R.drawable.class);
    
    ответ дан Daniel De León, с репутацией 8786, 12.07.2013
  • 29 рейтинг

    Как получить идентификатор ресурса приложения из из имени ресурса - довольно распространенный и хорошо отвеченный вопрос.

    Как получить собственный идентификатор ресурса Android из имени ресурса, менее ответили. Вот мое решение, чтобы получить ресурс Android для рисования по имени ресурса:

    public static Drawable getAndroidDrawable(String pDrawableName){
        int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
        if(resourceId==0){
            return null;
        } else {
            return Resources.getSystem().getDrawable(resourceId);
        }
    }
    

    Метод можно изменить для доступа к другим типам ресурсов.

    ответ дан Martin Pearman, с репутацией 579, 12.04.2012
  • 9 рейтинг

    Если вам нужно соединить строку и целое число, то как насчет карты?

    static Map icons = new HashMap();
    
    static {
        icons.add("icon1", R.drawable.icon);
        icons.add("icon2", R.drawable.othericon);
        icons.add("someicon", R.drawable.whatever);
    }
    
    ответ дан Peter Knego, с репутацией 75499, 14.05.2011
  • 9 рейтинг

    Вы можете использовать Resources.getIdentifier(), хотя вам нужно использовать формат для вашей строки, поскольку вы используете ее в XML-файлах, т.е. е. package:drawable/icon.

    ответ дан EboMike, с репутацией 63645, 13.12.2010
  • 5 рейтинг

    Мне так понравилось, у меня работает:

        imageView.setImageResource(context.getResources().
             getIdentifier("drawable/apple", null, context.getPackageName()));
    
    ответ дан Sarvar Nishonboyev, с репутацией 3145, 26.07.2013
  • 4 рейтинг

    Простой способ получения идентификатора ресурса из строки. Здесь resourceName - это имя ресурса ImageView в папке для рисования, которое также включено в XML-файл.

    int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);
    
    ответ дан Muhammad Adil, с репутацией 232, 27.04.2015
  • 3 рейтинг

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

    String name = getResources().getResourceEntryName(id);
    

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

    ответ дан Steve Waring, с репутацией 1599, 2.08.2014
  • 1 рейтинг
    public int getDrawableName(Context ctx,String str){
        return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
    
    }
    
    ответ дан Ivan Vovk, с репутацией 129, 9.10.2017
  • 1 рейтинг

    В MonoDroid / Xamarin. Android вы можете сделать:

     var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);
    

    Но так как GetIdentifier это не рекомендуется в Android - вы можете использовать Reflection следующим образом:

     var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);
    

    , где я предлагаю поставить try / catch или проверить строки, которые вы передаете.

    ответ дан Daniele D., с репутацией 1781, 27.05.2016
  • 0 рейтинг

    В вашем res / layout / my_image_layout. xml

    
        
        
    
    

    Чтобы получить этот ImageView по значению @ + id, внутри вашего Java-кода сделайте следующее:

    String row = "0";
    String column= "7";
    String tileID = "row_" + (row) + "_col_" + (column);
    ImageView image = (ImageView) activity.findViewById(activity.getResources()
                    .getIdentifier(tileID, "id", activity.getPackageName()));
    
    /*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
    image.setImageResource(R.mipmap.blank);  
    
    ответ дан Gene, с репутацией 6072, 3.04.2018
  • 0 рейтинг

    Для получения Drawable id из имени ресурса String я использую этот код:

    private int getResId(String resName) {
        int defId = -1;
        try {
            Field f = R.drawable.class.getDeclaredField(resName);
            Field def = R.drawable.class.getDeclaredField("transparent_flag");
            defId = def.getInt(null);
            return f.getInt(null);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            return defId;
        }
    }
    
    ответ дан bitvale, с репутацией 329, 29.06.2016