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.Rnamespace 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.contextdiinternalisasi sebagai Activity, Serviceatau Contextsubkelas lainnya .
Memperbarui:
Jika itu nama yang Anda inginkan, Resourceskelas (dikembalikan oleh getResources()) memiliki getResourceName(int)metode, dan a getResourceTypeName(int)?
Pembaruan 2 :
The Resourceskelas 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 VersionviaExtension FunctionUntuk 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()
}
UsageSekarang semua id sumber daya dapat diakses di mana pun Anda memiliki referensi konteks menggunakan resIdByNamemetode:
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".