Saya menambahkan TextViews secara terprogram dalam for-loop dan menambahkannya ke ArrayList.
Bagaimana saya menggunakan TextView.setId(int id)
? ID Integer apa yang saya buat sehingga tidak bertentangan dengan ID lain?
Saya menambahkan TextViews secara terprogram dalam for-loop dan menambahkannya ke ArrayList.
Bagaimana saya menggunakan TextView.setId(int id)
? ID Integer apa yang saya buat sehingga tidak bertentangan dengan ID lain?
Menurut View
dokumentasi
Pengidentifikasi tidak harus unik dalam hierarki tampilan ini. Pengidentifikasi harus berupa angka positif.
Jadi, Anda dapat menggunakan bilangan bulat positif apa pun yang Anda suka, tetapi dalam hal ini ada beberapa tampilan dengan id yang setara. Jika Anda ingin mencari beberapa tampilan dalam hierarki panggilan setTag
dengan beberapa objek utama mungkin berguna.
findViewById
ada jaminan untuk tampilan yang dikembalikan jika ada lebih dari satu dengan ID yang sama? Dokumen tidak menyebutkan apa pun.findViewById
akan mengembalikan yang pertama kali ditemukannya.setContentView()
memiliki katakanlah, 10 tampilan dengan id mereka diatur ke nomor id yang sama dalam hierarki yang sama , maka panggilan untukfindViewById([repeated_id])
akan mengembalikan tampilan pertama diatur dengan satu id yang diulang. Itu yang saya maksud.Dari API level 17 ke atas, Anda dapat menghubungi: View.generateViewId ()
Kemudian gunakan View.setId (int) .
Jika aplikasi Anda ditargetkan lebih rendah dari API level 17, gunakan ViewCompat.generateViewId ()
sumber
AtomicInteger
implementasi metode.for(;;)
belum pernah saya lihat sebelumnya. Apa itu namanya?Anda dapat mengatur ID yang akan Anda gunakan nanti di
R.id
kelas menggunakan file sumber daya xml, dan biarkan Android SDK memberi mereka nilai unik selama waktu kompilasi.Untuk menggunakannya dalam kode:
sumber
"int currentId = 1000; whateverView.setId(currentId++);
- Itu menambah ID setiap kalicurrentId++
digunakan, memastikan ID unik, dan saya dapat menyimpan ID di ArrayList saya untuk akses nanti.<resources>
.Juga Anda dapat menentukan
ids.xml
dires/values
. Anda dapat melihat contoh yang tepat dalam kode sampel android.sumber
Sejak API 17,
View
kelas memiliki metode statisgenerateViewId()
yang akansumber
Ini bekerja untuk saya:
sumber
findViewById()
adalah operasi yang lambat. Pendekatannya berhasil, tetapi dengan biaya kinerja.(Ini adalah komentar untuk jawaban dilettante tapi terlalu panjang ... hehe)
Tentu saja statis tidak diperlukan di sini. Anda bisa menggunakan SharedPreferences untuk menyimpan, bukan statis. Either way, alasannya adalah untuk menyimpan kemajuan saat ini sehingga tidak terlalu lambat untuk tata letak yang rumit. Karena, pada kenyataannya, setelah digunakan sekali, itu akan agak cepat nantinya. Namun, saya tidak merasa ini adalah cara yang baik untuk melakukannya karena jika Anda harus membangun kembali layar Anda lagi (katakanlah
onCreate
dipanggil lagi), maka Anda mungkin ingin memulai dari awal lagi, menghilangkan kebutuhan untuk statis. Karena itu, buat saja variabel instan bukan statis.Ini adalah versi yang lebih kecil yang berjalan sedikit lebih cepat dan mungkin lebih mudah dibaca:
Fungsi di atas ini harus memadai. Karena, sejauh yang saya tahu, ID yang dihasilkan android ada dalam miliaran, jadi ini mungkin akan kembali
1
pertama kali dan selalu sangat cepat. Karena, itu sebenarnya tidak akan melewati ID yang digunakan untuk menemukan yang tidak digunakan. Namun, pengulangan itu harus ada jika benar-benar menemukan ID yang digunakan.Namun, jika Anda tetap ingin progres disimpan di antara rekreasi ulang aplikasi Anda berikutnya, dan ingin menghindari penggunaan statis. Ini adalah versi SharedPreferences:
Jawaban untuk pertanyaan serupa ini akan memberi tahu Anda segala yang perlu Anda ketahui tentang ID dengan android: https://stackoverflow.com/a/13241629/693927
EDIT / FIX: Baru sadar saya benar-benar melakukan kesalahan save. Saya pasti mabuk.
sumber
Pustaka 'Compat' sekarang juga mendukung
generateViewId()
metode untuk level API sebelum 17.Pastikan untuk menggunakan versi
Compat
pustaka yang ada27.1.0+
Misalnya, di
build.gradle
file Anda , masukkan:implementation 'com.android.support:appcompat-v7:27.1.1
Maka Anda bisa menggunakan
generateViewId()
dariViewCompat
kelas bukanView
kelas sebagai berikut://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Selamat coding!
sumber
Hanya tambahan untuk jawaban @ phantomlimb,
saat
View.generateViewId()
membutuhkan API Level> = 17,alat ini kompatibel dengan semua API.
menurut Level API saat ini,
ia memutuskan cuaca menggunakan sistem API atau tidak.
jadi Anda bisa menggunakan
ViewIdGenerator.generateViewId()
danView.generateViewId()
dalam waktu yang bersamaan dan tidak perlu khawatir mendapatkan id yang samasumber
for (;;) { … }
berasal dari Kode Sumber Android.generateViewId()
else { return View.generateViewId(); }
ini akan menuju loop tak terbatas untuk level api yang lebih kecil dari 17 perangkat?Untuk menghasilkan secara dinamis bentuk Id Penggunaan API 17 digunakan
generateViewId ()
Yang akan menghasilkan nilai yang cocok untuk digunakan di
setId(int)
. Nilai ini tidak akan bertabrakan dengan nilai ID yang dihasilkan saat membangun oleh aapt untukR.id
.sumber
...
sumber
Saya menggunakan:
Dengan menggunakan nomor acak saya selalu memiliki peluang besar untuk mendapatkan id unik dalam upaya pertama.
sumber
sumber
Pilihan saya:
sumber