Ben onun dize veya Drawable gibi bir kaynağa kendi int kimliği değil, erişmek istiyorum.
Bunun için hangi yöntemi kullanmalıyım?
Ben onun dize veya Drawable gibi bir kaynağa kendi int kimliği değil, erişmek istiyorum.
Bunun için hangi yöntemi kullanmalıyım?
Yanıtlar:
Gibi bir şey olacak:
R.drawable.resourcename
Android.R
Eclipse'i karıştırabileceğinden (kullandığınız buysa) ad alanının içe aktarılmadığından emin olun .
Bu işe yaramazsa, her zaman bir bağlamın getResources
yöntemini kullanabilirsiniz ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Burada this.context
bir şekilde balatilabilir edilir Activity
, Service
ya da başka bir Context
alt sınıfı.
Güncelleme:
İstediğiniz ad ise, Resources
(döndürülen getResources()
) sınıfın bir getResourceName(int)
yöntemi ve bir getResourceTypeName(int)
?
Güncelleme 2 :
Resources
Sınıfı bu yöntemi vardır:
public int getIdentifier (String name, String defType, String defPackage)
Belirtilen kaynak adı, türü ve paketinin tamsayısını döndürür.
R.drawable.resourcename
bir tamsayıdır.
Eğer doğru anladıysam, istediğin buydu
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Burada "bu" sadece açıklığa kavuşturmak için yazılmış bir Faaliyettir.
Strings.xml dosyasında bir Dize veya bir UI öğesinin tanımlayıcısı olmasını istiyorsanız, "çizilebilir" ifadesinin yerine
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Sizi uyarıyorum, tanımlayıcıları elde etmenin bu yolu gerçekten yavaş, sadece gerektiğinde kullanın.
Resmi belgelere bağlantı: Resources.getIdentifier (Dize adı, Dize defType, Dize defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Kotlin Version
üzerindenExtension Function
Bir kaynak kimliğini adıyla bulmak için Kotlin'de, bir kotlin dosyasına aşağıdaki snippet'i ekleyin:
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
Artık resIdByName
yöntemi kullanarak bir bağlam başvurunuz olduğunda tüm kaynak kimliklerine erişilebilir :
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Dizeden kaynak kimliği almanın basit bir yolu. Burada resourceName, XML dosyasında da bulunan çekilebilir klasördeki ImageView kaynağının adıdır.
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);
Bir kaynak kimliği almak için yöntemimi kullanmanızı öneririm. Yavaş olan getIdentidier () yöntemini kullanmaktan çok daha verimlidir.
İşte kod:
/**
* @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());
Bu sınıfı kaynaklarla başa çıkmak için çok yararlı buldum . Bu gibi dimenler, renkler, çekilebilirler ve dizelerle uğraşmak için bazı tanımlanmış yöntemlere sahiptir:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
@lonkly çözümüne ek olarak
yöntem:
/**
* 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());
}
}
Kotlin'de şu benim için iyi çalışıyor:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Kaynak mipmap klasörüne yerleştirilirse, "çizilebilir" yerine "mipmap" parametresini kullanabilirsiniz.