Bisakah saya menggunakan id yang sama dalam tata letak yang berbeda di Android?

90

Saya baru mengenal pengembangan Android. Apakah boleh menggunakan ID yang sama untuk gambar dan file XML yang TextViewsberbeda Layout?

Ketika gerhana daftar otomatis untuk saya, itu mencantumkan semua variabel tata letak dari proyek, jadi apakah itu akan bertabrakan? Sampai sekarang saya belum melihat adanya masalah dalam menggunakan ID yang sama dalam tata letak yang berbeda, tetapi saya khawatir dalam jangka panjang.

happyhardik
sumber
Posting terkait - dua tampilan dengan id yang sama
RBT
@Pavel Anda masih membutuhkan ID untuk menyesuaikan batasan.
Sadda Hussain

Jawaban:

96

Anda disarankan untuk menggunakan id yang berbeda untuk tata letak yang berbeda. Dalam jangka panjang, ketika Anda akan memiliki banyak tata letak dan karenanya banyak id akan menjadi sangat rumit untuk membedakannya.

Saya biasanya nama id saya seperti ini: layoutName_elementId.

Berfungsi bagi saya untuk dengan mudah menemukan id yang saya cari, terutama saat menggunakan pelengkapan otomatis (saya tahu tata letak apa yang saya kerjakan, tapi saya tidak terlalu tahu id; dalam hal ini, dengan strategi penamaan saya, saya hanya ketik nama tata letak dan itu akan membawa semua id tata letak itu).

Informasi lebih lanjut tentang tata letak dan id dapat ditemukan di sini .

Selamat membuat kode,

Penginjil Chupamobile
sumber
2
Apa masalah mencari katakanlah ok_buttondalam setiap aktivitas Anda? Pelengkapan otomatis bahkan lebih jelas lagi jika Anda tahu obrolan yang Anda cari.
Dan Chaltiel
132

Jawaban singkatnya: Ya, Anda bisa.

Jawaban panjang: Anda bisa melakukan ini karena setiap kali Anda menggunakan findViewById () untuk mendapatkan referensi ke bagian tata letak Anda, metode ini hanya mencari tampilan tersebut dalam tata letak yang saat ini dinaikkan. Jadi, meskipun Anda memiliki tampilan lain dengan ID yang sama di tata letak lain, Android tidak akan mencarinya di sana.

Raghav Sood
sumber
15
Bisakah Anda memberikan jawaban yang lebih panjang? Karena R.id.layout_id adalah bilangan bulat statis, dan ditentukan sebelumnya pada waktu kompilasi, jadi findViewById () tidak akan mengetahui tata letak yang saat ini melambung.
Chloe
22
Demi orang lain yang menemukan pertanyaan ini, saya ingin menjawab permintaan Chloe. ID akan sama untuk setiap tampilan, tetapi tidak akan pernah muncul dua kali dalam aktivitas yang sama. Sebagai metafora, pertimbangkan apa yang akan terjadi jika saya memberi Anda setumpuk kertas, semuanya dengan banyak angka. Beberapa dari lembaran kertas ini bertuliskan angka 4. Anda sedang melihat salah satu seprai, dan saya meminta Anda untuk melingkari 4. Ini mudah. Sekarang Anda melihat lembar lain dengan angka 4 di atasnya. Anda juga dapat menemukan dan melingkari itu. Tidak masalah bahwa nomor tersebut ditentukan sebelumnya.
Ted Cannelongo
6
Saya tidak setuju dengan komentar Ted, Anda dapat memiliki pada saat yang sama dua komponen dengan ID yang sama berjalan di Aktivitas yang sama. Saya baru saja mengalami masalah pada sebuah aplikasi, saya menggunakan dua ViewPager yang berbeda secara bersamaan di aktivitas utama. Ketika saya mencoba untuk mengambil ViewPager yang saat ini ditampilkan dengan ID, itu benar-benar mengambil yang lain yang berjalan di latar belakang. Saya memperbaiki masalah hanya dengan membuat kedua ID itu unik.
Yoann Hercouet
8
@YoannHercouet Saya percaya bahwa ini karena keduanya berada di sheet yang sama (Aktivitas)
Naheel
22

Menurut panduan API pengembang:

Sebuah ID tidak harus unik di seluruh pohon, tetapi harus unik di dalam bagian pohon yang Anda telusuri (yang mungkin sering kali merupakan keseluruhan pohon, jadi yang terbaik adalah benar-benar unik jika memungkinkan).

Jadi jawaban singkatnya adalah ini tidak wajib tetapi merupakan praktik yang baik untuk menghindari kemungkinan konflik.

Alex Epelde
sumber
1
Saya pernah membuat id yang sama secara tidak sengaja. Membatalkan penggantian nama mereka nanti adalah pekerjaan yang berat karena semua contoh telah dihidupkan kembali. Ini berarti sekali Anda memiliki konflik id, Anda kacau. Akan sangat sulit untuk memisahkan semuanya kembali.
t3chb0t
@ t3chb0t Sungguh! Meskipun Anda mencentang "khusus lokal", Android Studio mengganti nama semua instance. Benar-benar konyol.
John Glen
15

Tidak disarankan, karena jika di masa mendatang Anda perlu melakukan refaktorisasi view id, Android studio akan melakukan pemfaktoran ulang di semua XMLfile dan kelas dan Anda akan mendapat masalah.

Tetapi ada juga beberapa kasus ketika Anda memang perlu menggunakan yang sama idmisalnya jika Anda memiliki beberapa abstrak dan Anda menggunakan kembali beberapa tata letak.

Jika Anda memiliki beberapa viewsdengan yang sama id'sdalam proyek Anda dan Anda perlu melakukan refactor, lakukan secara manual, jangan gunakan fungsi build in IDE, ubah iddalam tampilan target di dalam XMLtata letak lalu perbaiki kesalahan merah di dalam tata letak.

Pavel Poley
sumber