Bilinen bir kaynak adına sahip bir kaynak kimliği nasıl edinilir?


Yanıtlar:


149

Gibi bir şey olacak:

R.drawable.resourcename

Android.REclipse'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 getResourcesyöntemini kullanabilirsiniz ...

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

Burada this.contextbir şekilde balatilabilir edilir Activity, Serviceya da başka bir Contextalt 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 :

ResourcesSı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.


Cevabınız için teşekkür ederiz .R.drawable.resourcename Ben şimdi kullanıyorum kaynakçı
Aswan

2
R.drawable.resourcename bir tamsayıdır.
Rabid

Merhaba Rabid. Resouce ileterek R.drawable .resource değerine erişmenin herhangi bir yolu olduğunu söylediniz
Aswan

dinamik olarak kaynak adı geçerek bu tamsayı değerine ihtiyacım var
Aswan

Bu gibi Thankq istiyorum ve ben çizilebilir kaynak id almak istiyorum. Nasıl ben wil
Aswan

341

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)


3
Bu, belirli dizelerin var olduğundan vb. Emin olmak için test yazma bağlamında oldukça kullanışlıdır
Ehtesh Choudhury

1
Adam bilmiyorum, ben zaman damgası ile getIdentifier () önce ve sonra bir Log ekledim ve bana 0 - 1 ms içinde idam olduğunu gösterdi! Yani yavaş değil, süper hızlı! Kaynaklardan görüntü almak için kullanıyorum ve mükemmel çalışıyor. Nexus5x üzerinde test edilmiştir.
Kirill Karmazin

1
@KirillKarmazin: Nexus5X oldukça hızlı bir telefon ve böyle bir arama için 1 ms oldukça yavaş. Her kullanıcı arayüzü çerçevesinin yalnızca 16 ms olduğunu unutmayın.
Mooing Duck

wikipedia kotlin ilk 2011 yılında ortaya çıktı, 2010 yılında bu konuda bir soruya nasıl cevap verebilir
Abhinav Chauhan

25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());

15

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 resIdByNameyö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")
.
.
.    

wikipedia kotlin ilk 2011 yılında ortaya çıktı, lütfen bana bu sorunun 2010 yılında nasıl sorulduğunu söyleyebilir misiniz, ve 2019 yılında android için ilan edildi, 2010 yılında kotlin android sorusunu nasıl sordu
Abhinav Chauhan

14

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);

6

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;

}

Tüm durumlar için çalışmaz. Örneğin, <string name = "string.name"> içerik </string> varsa, R.string sınıfının bir string_name alanı olacaktır. Ve yönteminiz bu noktada çalışmaz.
ddmytrenko

3
Ayrıca yönteminiz aslında hızlı değil. Çünkü Java sınıfı serileştirme hiçbir zaman hızlı çalışmaz.
ddmytrenko

5
// 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());

0

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 "";
    }
}

wikipedia kotlin ilk 2011 yılında ortaya çıktı, lütfen bana bu sorunun 2010 yılında nasıl sorulduğunu söyleyebilir misiniz, ve 2019 yılında android için ilan edildi, 2010 yılında kotlin android sorusunu nasıl sordu
Abhinav Chauhan

0

@lonkly çözümüne ek olarak

  1. yansımalara ve alan erişilebilirliğine bakın
  2. gereksiz değişkenler

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());
    }
}

wikipedia kotlin ilk 2011 yılında ortaya çıktı, lütfen bana bu sorunun 2010 yılında nasıl sorulduğunu söyleyebilir misiniz, ve 2019 yılında android için ilan edildi, 2010 yılında kotlin android sorusunu nasıl sordu
Abhinav Chauhan

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.