Adını bildiğim bir görüntünün kaynak kimliğini nasıl alırım?


Yanıtlar:


269

Bunun gibi bir şeyle:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
Teşekkürler, bu benzer bir soruna çözüm bulmama yardımcı oldu! getResources().getIdentifier(name, "id", getPackageName());Bir ImageButton kimliğini elde etmek için kullanacağım (R.id.name ile yapacağınız gibi).
— Seçiniz


1
değişkende tam olarak ne var name? Referansını bildiğim bir düğmenin kimliğini bulmak istiyorum, benim durumumdabutton1
— John Watson

1
getResource()ve getPackageName()hata gösteren. cannot resolve method
— Srujan Barai

@Srujan Barai, getResource()ve getPackageName()Activity'den yöntemler.
— Berga

29

Ayrıca şunu da deneyebilirsiniz:

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

Bu kaynak kodları aşağıdaki URL'den kopyaladım. Bu sayfada yapılan testlere göre getIdentifier () 'dan 5 kat daha hızlıdır. Ayrıca daha kullanışlı ve kullanımı kolay buldum. Umarım sana da yardımcı olur.

Bağlantı: Android'de Kaynakları Dinamik Olarak Alma


2
bu daha hızlı olabilir ama proguard kullanırsanız başınızı belaya sokabileceğini anladım. Bu proguard'da en azından benim için işe yaramadı
— Pedro Rainho

Genel istisnaları yakalamak özellikle kötü bir fikirdir. Ayrıca, çekilebilir ürüne sert referanslar yoksa, Proguard'ın herhangi bir yerde kullanıldığına inanmadığı için referansı optimize edebileceğini unutmayın.
— Paul Lammertsma

Şimdi anlıyorum :) optimizasyon sırasında drawableName değişikliklerinin ve kaynakların bu yöntem kullanılarak bulunamayacağını söylüyorsunuz, eğer haklıysam? :)
— VSB

1
@VSB: Son yorumunuz Paul Lammertsma'nın hemen yukarıdaki yorumuna bir yanıt ise: Hayır, Proguard'ın bunun kaynağa bir referans olduğunu bilmediğini ve dolayısıyla kullanılmadığına inanarak kaynağı kaldırabileceğini kastediyor.
— ToolmakerSteve

xxxxhdpi, xxhdpi, vb. kullandıktan sonra bu yöntem daha az kullanışlı hale gelir
— Someone Somewhere,

11

Bir genel sistem kaynağı örneği:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

uyarmak

Başka bir yol da android.R.drawable sınıfının belgelerine başvurmaktır .


1
@Milaaaad ne demek istiyorsun?
— naXa

bu koddaki kaynaklarla karıştırdığım anlamına geliyor ve bunu etkinlik dışı sınıfta kullanıyorum
— Milaaaad

1
@Milaaaad Bu yöntem sistem kaynakları içindir. Bağlama bağlı değiller.
— naXa

10

Bir Kaynak Kimliği almak için bu işlevi kullanabilirsiniz:

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


Dolayısıyla, Çekilebilir Kaynak Kimliği almak istiyorsanız , yöntemi şu şekilde çağırabilirsiniz:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(veya bir parçadan):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


Bir Dize Kaynak Kimliği için bunu şu şekilde çağırabilirsiniz:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

vb...


Dikkatli : Kaynak Kimliğini bulamazsa bir RuntimeException oluşturur. Üretim sırasında uygun şekilde toparlandığınızdan emin olun.

Oku bunu


4
Sanırım bundan çıkarmanız gerekiyor static, aksi takdirde getResources()işe yaramayacak.
— Richard Le Mesurier

@Richard Le Mesurier, nedenini açıklar mısınız? Teşekkür ederim.
— Veer

1
@ Leo.Han Bu yorumu yaptığım sırada Contextmevcut değildi. Düzeltme, staticonu kaldırıp a Context(örneğin Activityveya Application); ya da alternatif düzeltme, Jonathan'ın düzenlemesinde yaptığı Context, yönteme bir geçiş yapmaktır.
— Richard Le Mesurier

1
@Richard Le Mesurier, düzenleme geçmişini biraz önce kontrol ettim, aynen söylediğiniz gibi, yıllar sonra nazik cevabınız için teşekkür ederim :)
— Veer

0

Karşılaştığım bir başka senaryo.

String imageName = "Merhaba" ve sonra getIdentifier işlevine ilk argüman olarak iletildiğinde, adı dize null sonlandırma ile geçirecek ve her zaman sıfır döndürecektir. Bu imageName.substring (0, imageName.length () - 1) geçin

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.