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
@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.
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_alertint id =Resources.getSystem().getIdentifier("ic_dialog_alert","drawable","android");
Cara lain adalah dengan merujuk dokumentasi untuk kelas android.R.drawable .
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)
Jawaban:
Dengan sesuatu seperti ini:
sumber
getResources().getIdentifier(name, "id", getPackageName());
untuk mendapatkan ID ImageButton (seperti yang Anda lakukan dengan R.id.name).name
? Saya ingin menemukan id dari tombol yang referensi saya tahu, dalam kasus saya itubutton1
getResource()
dangetPackageName()
menunjukkan kesalahan.cannot resolve method
getResource()
dangetPackageName()
adalah metode dari Activity.Anda juga dapat mencoba ini:
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
sumber
Contoh untuk sumber daya sistem publik:
Cara lain adalah dengan merujuk dokumentasi untuk kelas android.R.drawable .
sumber
Anda dapat menggunakan fungsi ini untuk mendapatkan ID Sumber Daya:
Jadi jika Anda ingin mendapatkan ID Sumber Daya Yang Dapat Digambar , Anda dapat memanggil metode seperti ini:
(atau dari sebuah fragmen):
Untuk ID Sumber Daya String, Anda dapat menyebutnya seperti ini:
dll ...
Hati-hati : Ini melempar RuntimeException jika gagal menemukan Resource ID. Pastikan untuk pulih dengan benar dalam produksi.
Baca ini
sumber
static
, kalaugetResources()
tidak tidak akan berhasil.Context
itu tidak tersedia. Fix adalah untuk menghapusstatic
dan memindahkannya keContext
(misalnyaActivity
atauApplication
); atau perbaikan alternatif adalah apa yang dilakukan Jonathan dalam editnya, yaitu meneruskan aContext
ke metode.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)
sumber