Я хочу получить доступ к ресурсу типа String или Drawable по его имени, а не по его int id.
Какой метод я бы использовал для этого?
Я хочу получить доступ к ресурсу типа String или Drawable по его имени, а не по его int id.
Какой метод я бы использовал для этого?
Ответы:
Это будет что-то вроде:
R.drawable.resourcename
Убедитесь, что у вас нет Android.R
импортированного пространства имен, так как это может запутать Eclipse (если это то, что вы используете).
Если это не сработает, вы всегда можете использовать getResources
метод контекста ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Где this.context
находится intialised как Activity
, Service
или любой другой Context
подкласс.
Обновить:
Если это имя, которое вы хотите, у Resources
класса (возвращаемого getResources()
) есть getResourceName(int)
метод, а getResourceTypeName(int)
?
Обновление 2 :
У Resources
класса есть этот метод:
public int getIdentifier (String name, String defType, String defPackage)
Который возвращает целое число указанного имени ресурса, типа & пакета.
R.drawable.resourcename
это целое число
Если я правильно понял, это то, что вы хотите
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Где «это» - это Деятельность, написанная только для пояснения.
Если вы хотите String в strings.xml или идентификатор элемента пользовательского интерфейса, замените «drawable»
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Я предупреждаю вас, этот способ получения идентификаторов очень медленный, используйте его только там, где это необходимо.
Ссылка на официальную документацию: Resources.getIdentifier (String name, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Простой способ получить идентификатор ресурса из строки. Здесь 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);
Kotlin Version
черезExtension Function
Чтобы найти идентификатор ресурса по его имени В Kotlin добавьте приведенный ниже фрагмент кода в файл Kotlin:
ExtensionFunctions.kt
import android.content.Context
import android.content.res.Resources
fun Context.resIdByName(resIdName: String?, resType: String): Int {
resIdName?.let {
return resources.getIdentifier(it, resType, packageName)
}
throw Resources.NotFoundException()
}
Usage
Теперь все идентификаторы ресурсов доступны везде, где у вас есть контекстная ссылка, используя resIdByName
метод:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Я бы предложил вам использовать мой метод для получения идентификатора ресурса. Это гораздо эффективнее, чем использование метода 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;
}
// image from res/drawable
int resID = getResources().getIdentifier("my_image",
"drawable", getPackageName());
// view
int resID = getResources().getIdentifier("my_resource",
"id", getPackageName());
// string
int resID = getResources().getIdentifier("my_string",
"string", getPackageName());
Я нашел этот класс очень полезным для работы с ресурсами. У него есть несколько определенных методов для работы с измерениями, цветами, рисованными объектами и строками, как этот:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
в дополнение к @lonkly решение
метод:
/**
* 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());
}
}
В Котлине у меня нормально работает следующее:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Если ресурс находится в папке mipmap, вы можете использовать параметр «mipmap» вместо «drawable».