Tôi muốn truy cập tài nguyên như Chuỗi hoặc Drawable bằng tên của nó chứ không phải int id của nó.
Phương pháp nào tôi sẽ sử dụng cho việc này?
Tôi muốn truy cập tài nguyên như Chuỗi hoặc Drawable bằng tên của nó chứ không phải int id của nó.
Phương pháp nào tôi sẽ sử dụng cho việc này?
Câu trả lời:
Nó sẽ giống như:
R.drawable.resourcename
Hãy chắc chắn rằng bạn không có Android.R
không gian tên được nhập vì nó có thể gây nhầm lẫn với Eclipse (nếu đó là những gì bạn đang sử dụng).
Nếu điều đó không hiệu quả, bạn luôn có thể sử dụng getResources
phương thức của bối cảnh ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Trong trường hợp this.context
được intialised như một Activity
, Service
hoặc bất kỳ khác Context
lớp.
Cập nhật:
Nếu đó là tên bạn muốn, Resources
lớp (được trả về getResources()
) có một getResourceName(int)
phương thức và a getResourceTypeName(int)
?
Cập nhật 2 :
Các Resources
lớp học có phương pháp này:
public int getIdentifier (String name, String defType, String defPackage)
Trả về số nguyên của tên, loại & gói tài nguyên đã chỉ định.
R.drawable.resourcename
là số nguyên.
Nếu tôi hiểu đúng, đây là những gì bạn muốn
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Trong đó "đây" là một Hoạt động, được viết chỉ để làm rõ.
Trong trường hợp bạn muốn có một chuỗi trong String.xml hoặc mã định danh của một thành phần UI, hãy thay thế "drawable"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Tôi cảnh báo bạn, cách lấy số nhận dạng này thực sự rất chậm, chỉ sử dụng khi cần thiết.
Liên kết đến tài liệu chính thức: Resources.getIdentifier (Tên chuỗi, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Kotlin Version
thông quaExtension Function
Để tìm id tài nguyên theo tên của nó Trong Kotlin, hãy thêm đoạn mã bên dưới vào tệp kotlin:
Tiện ích mở rộng.kt.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
Bây giờ tất cả các id tài nguyên có thể truy cập bất cứ nơi nào bạn có tham chiếu ngữ cảnh bằng resIdByName
phương thức:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Một cách đơn giản để lấy ID tài nguyên từ chuỗi. Ở đây resourceName là tên của ImageView tài nguyên trong thư mục drawable cũng được bao gồm trong tệp 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);
Tôi sẽ đề nghị bạn sử dụng phương pháp của tôi để lấy ID tài nguyên. Nó hiệu quả hơn nhiều so với sử dụng phương thức getIdentidier (), chậm.
Đây là mã:
/**
* @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());
Tôi đã tìm thấy lớp này rất hữu ích để xử lý với các tài nguyên. Nó có một số phương thức được xác định để xử lý các độ mờ, màu sắc, hình vẽ và chuỗi, như phương pháp này:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
ngoài giải pháp @lonkly
phương pháp:
/**
* 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());
}
}
Trong Kotlin sau đây hoạt động tốt cho tôi:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Nếu tài nguyên được đặt trong thư mục mipmap, bạn có thể sử dụng tham số "mipmap" thay vì "drawable".