Bagaimana saya mendapatkan id sumber daya dari suatu gambar jika saya tahu namanya?

Jawaban:

269

Dengan sesuatu seperti ini:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
Francesco Laurita
sumber
10
Terima kasih, itu membantu saya menemukan solusi untuk masalah serupa! Saya akan gunakan getResources().getIdentifier(name, "id", getPackageName());untuk mendapatkan ID ImageButton (seperti yang Anda lakukan dengan R.id.name).
Pilih0r
42
Perhatikan bahwa nama yang dapat
digambar
1
apa sebenarnya yang terjadi pada variabel name? Saya ingin menemukan id dari tombol yang referensi saya tahu, dalam kasus saya itubutton1
John Watson
1
getResource()dan getPackageName()menunjukkan kesalahan. cannot resolve method
Srujan Barai
@Srujan Barai, getResource()dan getPackageName()adalah metode dari Activity.
The Berga
29

Anda juga dapat mencoba ini:

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

Saya telah menyalin kode sumber ini dari URL di bawah ini. Berdasarkan tes yang dilakukan di halaman ini, ini 5 kali lebih cepat daripada getIdentifier (). Saya juga merasa lebih praktis dan mudah digunakan. Semoga ini membantu Anda juga.

Tautan: Mengambil Sumber Daya Secara Dinamis di Android

VSB
sumber
2
ini mungkin lebih cepat tetapi saya menemukan itu bisa membuat Anda dalam masalah jika Anda menggunakan proguard. Ini tidak berhasil setidaknya bagi saya
Pedro Rainho
Menangkap pengecualian umum adalah ide yang sangat buruk. Selain itu, perhatikan bahwa jika tidak ada referensi sulit untuk digambar, Proguard dapat mengoptimalkan referensi karena tidak percaya bahwa itu digunakan di mana saja.
Paul Lammertsma
Saya mengerti sekarang :) maksud Anda selama optimasi perubahan drawableName dan sumber daya tidak dapat ditemukan menggunakan metode ini, jika saya benar? :)
VSB
1
@VSB: jika komentar terakhir Anda adalah respons terhadap komentar Paul Lammertsma segera di atas: Tidak, ia berarti bahwa Proguard tidak tahu ini adalah referensi ke sumber daya, dan mungkin dapat menghapus sumber daya, percaya bahwa itu tidak digunakan.
ToolmakerSteve
setelah Anda menggunakan xxxxhdpi, xxhdpi, dll. metode ini menjadi kurang bermanfaat
Seseorang di suatu tempat
11

Contoh untuk sumber daya sistem publik:

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

waspada

Cara lain adalah dengan merujuk dokumentasi untuk kelas android.R.drawable .

naXa
sumber
1
@Milaaaad apa maksudmu?
naXa
itu berarti saya bingung oleh sumber daya dalam kode dan saya menggunakannya di kelas non aktivitas
Milaaaad
1
@Milaaaad Metode ini untuk sumber daya sistem. Mereka tidak bergantung pada konteks.
naXa
10

Anda dapat menggunakan fungsi ini untuk mendapatkan ID Sumber Daya:

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


Jadi jika Anda ingin mendapatkan ID Sumber Daya Yang Dapat Digambar , Anda dapat memanggil metode seperti ini:

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

(atau dari sebuah fragmen):

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


Untuk ID Sumber Daya String, Anda dapat menyebutnya seperti ini:

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

dll ...


Hati-hati : Ini melempar RuntimeException jika gagal menemukan Resource ID. Pastikan untuk pulih dengan benar dalam produksi.

Baca ini

Azhar
sumber
4
Saya pikir Anda perlu menghapusnya static, kalau getResources()tidak tidak akan berhasil.
Richard Le Mesurier
@ Richard Le Mesurier, dapatkah Anda menjelaskan alasannya? Terima kasih.
Veer
1
@ Leo.Han Pada saat saya membuat komentar itu, Contextitu tidak tersedia. Fix adalah untuk menghapus staticdan memindahkannya ke Context(misalnya Activityatau Application); atau perbaikan alternatif adalah apa yang dilakukan Jonathan dalam editnya, yaitu meneruskan a Contextke metode.
Richard Le Mesurier
1
@ Richard Le Mesurier, saya memeriksa histori edit sekarang, seperti yang Anda katakan, terima kasih atas balasan baik Anda setelah bertahun-tahun :)
Veer
0

Satu skenario lain yang saya temui.

String imageName = "Hello" dan kemudian ketika dilewatkan ke fungsi getIdentifier sebagai argumen pertama, itu akan melewati nama dengan string null termination dan akan selalu mengembalikan nol. Lewati imageName.substring ini (0, imageName.length () - 1)

sunil shah
sumber