Android, получив идентификатор ресурса из строки?
Мне нужно передать идентификатор ресурса методу в одном из моих классов. Он должен использовать как идентификатор, на который ссылается ссылка, так и нужная строка. Как мне лучше всего это достичь?
Например:
R.drawable.icon
Мне нужно получить идентификатор целого числа, но мне также нужен доступ к строке "icon".
Было бы предпочтительнее, если бы все, что мне пришлось передать методу, это строка значка.
Ответы
Ответ 1
@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()
медленнее, чем использование отражения, как я. Проверьте это.
Ответ 2
Вы можете использовать эту функцию для получения идентификатора ресурса.
public static int getResourceId(String pVariableName, String pResourcename, String pPackageName)
{
try {
return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
Итак, если вы хотите получить функцию вызова drawable, подобную этой
getResourceId("myIcon", "drawable", getPackageName());
и для строки вы можете называть это следующим образом
getResourceId("myAppName", "string", getPackageName());
Прочтите это
Ответ 3
Это основано на ответе @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);
Ответ 4
Как получить идентификатор ресурса приложения из имени ресурса - довольно общий и хорошо ответивший вопрос.
Как получить идентификатор ресурса на родной 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);
}
}
Метод может быть изменен для доступа к другим типам ресурсов.
Ответ 5
Если вам нужно соединить строку и int, то как насчет карты?
static Map<String, Integer> icons = new HashMap<String, Integer>();
static {
icons.add("icon1", R.drawable.icon);
icons.add("icon2", R.drawable.othericon);
icons.add("someicon", R.drawable.whatever);
}
Ответ 6
Вы можете использовать Resources.getIdentifier()
, хотя вам нужно использовать формат для своей строки, поскольку вы используете ее в ваших XML файлах, т.е. package:drawable/icon
.
Ответ 7
Мне это понравилось, он работает для меня:
imageView.setImageResource(context.getResources().
getIdentifier("drawable/apple", null, context.getPackageName()));
Ответ 8
Так как вы сказали, что хотите передать только один параметр, и, похоже, не имеет значения, для чего вы можете передать идентификатор ресурса, а затем узнать имя строки для него, таким образом:
String name = getResources().getResourceEntryName(id);
Это может быть наиболее эффективным способом получения обоих значений. Вам не нужно возиться с поиском только части "значка" из более длинной строки.
Ответ 9
Простой способ получить идентификатор ресурса из строки. Здесь имя_каталога - это имя ресурса 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);
Ответ 10
Simple method to get resource ID:
public int getDrawableName(Context ctx,String str){
return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}
Ответ 11
В 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 или проверить строки, которые вы передаете.
Ответ 12
В вашем 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);
Ответ 13
Подход Котлина
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")
Ответ 14
Для получения идентификатора Drawable из имени ресурса 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;
}
}