Android, получить идентификатор ресурса из строки? - PullRequest
137 голосов
/ 13 декабря 2010

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

Например:

R.drawable.icon

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

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

Ответы [ 14 ]

1 голос
/ 02 апреля 2019

Подход Котлина

inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
            return try {
                val idField = getDeclaredField (resourceName)
                idField.getInt(idField)
            } catch (e:Exception) {
                e.printStackTrace()
                -1
            }
        }

Использование:

val resId = R.drawable::class.java.getId("icon")
1 голос
/ 03 апреля 2018

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

<LinearLayout ...>
    <ImageView
        android:id="@+id/row_0_col_7"
      ...>
    </ImageView>
</LinearLayout>

Чтобы получить этот 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);  
1 голос
/ 27 мая 2016

В 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 или проверить строки, которые вы передаете.

0 голосов
/ 29 июня 2016

Для получения 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;
    }
}
...