Я хочу получить доступ к ресурсу, например, к String или Drawable по его имени, а не к его идентификатору int.
Какой метод я использовал бы для этого?
Я хочу получить доступ к ресурсу, например, к String или Drawable по его имени, а не к его идентификатору int.
Какой метод я использовал бы для этого?
Это будет что-то вроде:
R.drawable.resourcename
Убедитесь, что у вас нет импортированного пространства имен Android.R
поскольку это может запутать Eclipse (если это то, что вы используете).
Если это не сработает, вы всегда можете использовать контекстный метод 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)
Который возвращает целое число указанного имени ресурса, типа & пакета.
Если я правильно понял, это то, что вы хотите
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Где "this" - действие, написанное только для уточнения.
Если вам нужна строка в файле strings.xml или идентификатор элемента пользовательского интерфейса, замените "drawable"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Я предупреждаю вас, что этот способ получения идентификаторов очень медленный, используйте только там, где это необходимо.
Ссылка на официальную документацию: Resource.getIdentifier(имя строки, строка defType, строка 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;
}
Я нашел этот класс, очень полезный для работы с ресурсами. Он имеет некоторые определенные методы для работы с размерами, цветами, чертежами и строками, такими как:
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 static field
return field.getInt(null);
} catch (Exception e) {
// rethrow as not found ex
throw new Resources.NotFoundException(e.getMessage());
}
}