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.