Saya ingin mengakses sumber daya seperti String atau Drawable dengan namanya dan bukan int id.
Metode mana yang akan saya gunakan untuk ini?
Saya ingin mengakses sumber daya seperti String atau Drawable dengan namanya dan bukan int id.
Metode mana yang akan saya gunakan untuk ini?
Jawaban:
Ini akan menjadi sesuatu seperti:
R.drawable.resourcename
Pastikan Anda tidak memiliki Android.R
namespace yang diimpor karena dapat membingungkan Eclipse (jika itu yang Anda gunakan).
Jika itu tidak berhasil, Anda selalu dapat menggunakan metode konteks getResources
...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Di mana this.context
diinternalisasi sebagai Activity
, Service
atau Context
subkelas lainnya .
Memperbarui:
Jika itu nama yang Anda inginkan, Resources
kelas (dikembalikan oleh getResources()
) memiliki getResourceName(int)
metode, dan a getResourceTypeName(int)
?
Pembaruan 2 :
The Resources
kelas memiliki metode ini:
public int getIdentifier (String name, String defType, String defPackage)
Yang mengembalikan bilangan bulat dari nama sumber daya, tipe & paket yang ditentukan.
R.drawable.resourcename
adalah bilangan bulat.
Jika saya mengerti benar, ini yang Anda inginkan
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Di mana "ini" adalah Kegiatan, ditulis hanya untuk memperjelas.
Jika Anda menginginkan sebuah String di strings.xml atau pengidentifikasi elemen UI, gantikan "drawable"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Saya memperingatkan Anda, cara mendapatkan pengenal ini sangat lambat, gunakan hanya jika diperlukan.
Tautan ke dokumentasi resmi: Resources.getIdentifier (Nama string, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Kotlin Version
viaExtension Function
Untuk menemukan id sumber daya dengan namanya Di Kotlin, tambahkan snippet di bawah ini di file 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
Sekarang semua id sumber daya dapat diakses di mana pun Anda memiliki referensi konteks menggunakan resIdByName
metode:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Cara sederhana untuk mendapatkan ID sumber daya dari string. Di sini resourceName adalah nama sumber daya ImageView di folder drawable yang termasuk dalam file XML juga.
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);
Saya sarankan Anda menggunakan metode saya untuk mendapatkan ID sumber daya. Ini jauh lebih efisien, daripada menggunakan metode getIdentidier (), yang lambat.
Berikut kodenya:
/**
* @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());
Saya merasa kelas ini sangat membantu untuk menangani sumber daya. Ini memiliki beberapa metode untuk menangani dimens, warna, drawable, dan string, seperti ini:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
selain solusi @lonkly
metode:
/**
* 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());
}
}
Di Kotlin berikut ini berfungsi dengan baik untuk saya:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Jika sumber daya ditempatkan di folder mipmap, Anda dapat menggunakan parameter "mipmap" alih-alih "drawable".