android:id ve R.id: Nedir ve Nasıl Kullanılır?

Kerem Aydın·7 Temmuz 2026·⏱2 dk

İki cümleyle: android:id, düzen (layout) içinde bir View'un ID'sini tanımlamak veya buna referans vermek için kullanılan bir XML niteliğidir (@+id/ad veya @id/ad formatında); R.id.ad ise derleme sırasında üretilen ve kodunuzda (findViewById, ViewBinding vb.) kullandığınız tamsayı sabitidir. Aradaki farkı anlamak, derleme hatalarından ve yanlış View referanslarından kaçınmanıza yardımcı olur.

Sürecin işleyişi (android:id → R.id)

  • Düzen dosyasında nitelik eklersiniz: android:id="@+id/myButton" — + işareti derleme sırasında yeni bir ID oluşturur. @id/myButton — daha önce tanımlanmış bir ID'ye referanstır.
  • AAPT kaynakları ayrıştırır ve public static final int myButton = 0x7f08xxxx biçiminde alanlara sahip R sınıfını (R.java / R.class) üretir.
  • Kodda R.id.myButton üzerinden erişirsiniz: findViewById(R.id.myButton) bu int-ID'ye göre View nesnesini döndürür.
  • Aynı layout ad alanında ID benzersiz değilse Android Studio genellikle uyarır veya derleme başarısız olabilir; yeniden adlandırma yeniden derleme gerektirir.

Yalnızca ilk tanımlamada @+id/ kullanın. Tekrarlayan referanslarda fazladan kayıt oluşturmamak için @id/ad uygulayın.

Pratik kullanım: findViewById, ViewBinding, include/merge

findViewById ile örnek (Kotlin):

setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.myButton)
button.setOnClickListener { /* ... */ }

ViewBinding önerilir (modülde etkinleştirin):

android {
  buildFeatures { viewBinding true }
}

Kod:

private lateinit var binding: ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.myButton.setOnClickListener { /* tür güvenliği sağlar */ }

include/merge: kullanıldığında include ID'si korunur; birleştirilmiş (merged) düzendeki öğeler, açıkça atanmadıkça üst düzende kendi ayrı ID'lerini almayabilir.

Yaygın hatalar ve çözümleri

  • Cannot resolve symbol R.id.name: Build → Clean / Rebuild çalıştırın, XML'deki hataları kontrol edin, Gradle'ı senkronize edin. Sıklıkla neden herhangi bir kaynaktaki sözdizimi hatasıdır.
  • Yinelenen ID'ler: Refactor → Rename ile yeniden adlandırma yapın veya isimleri tek bir stile getirin (btn_, tv_ ön ekleri gibi).
  • Fragment'te yanlış findViewById: requireView().findViewById(...) kullanın veya fragment'ler için ViewBinding tercih edin.
  • ProGuard/R8: Yansıma hatalarında R sınıflarının kaldırılmadığından emin olun; -keepclassmembers class *.R$ { public static ; } kuralı yardımcı olabilir.

Compose'da ID'lere güvenmeyin — burada daha çok durum (state) ve anahtarlar kullanılır, R.id değil.

Projelerde ID organizasyonu için ipuçları

  • Ön ekler: btn_login, tv_title — aramayı ve yeniden düzenlemeyi hızlandırır.
  • Büyük projelerde res/values/public.xml üzerinden ID dışa aktarımını yönetebilirsiniz.
  • Tür güvenliği ve daha az boilerplate kod için ViewBinding/DataBinding kullanın.

SSS

  • @+id içinde her zaman + yazmak gerekir mi? Yalnızca projede veya mevcut modülde ID'nin ilk tanımlamasında.
  • R üretilmeyi durdurursa ne yapılmalı? Tüm XML kaynaklarında (layout, manifest, values) hata arayın.
  • ID yalnızca kodda oluşturulabilir mi? Evet: View.setId(View.generateViewId()) veya basitçe view.id = ..., ancak bu ID'ler R'a eklenmez.

Temel kurallar şunlardır: ID'yi XML'de tanımlarsınız, AAPT R.id içinde bir sabit üretir ve kodda View'a bu sabit veya ViewBinding aracılığıyla erişirsiniz — böylece View ile ilgili sorunların çoğu ortadan kalkar.