Bağlama görüntüleme Android Jetpack'in bir parçasıdır.
Görüntü bağlama, görünümlerle etkileşime geçen kod yazmayı kolaylaştıran bir özelliktir. Bir modülde görüntü bağlama etkinleştirildiğinde, söz konusu modüldeki her XML düzen dosyası için bir bağlama sınıfı oluşturulur. Bağlama sınıfı örneği, ilgili düzende kimliği olan tüm görünümlere doğrudan referanslar içerir.
Çoğu durumda, görüntü bağlama findViewById
yerine geçer.
Kurulum
Bağlama görüntüleme, modül bazında etkinleştirilir. Bir modülde görüntü bağlamayı etkinleştirmek için modül düzeyindeki build.gradle
dosyasında viewBinding
derleme seçeneğini aşağıdaki örnekte gösterildiği gibi true
olarak ayarlayın:
Groovy
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
Bağlama sınıfları oluşturulurken bir düzen dosyasının yoksayılmasını istiyorsanız söz konusu düzen dosyasının kök görünümüne tools:viewBindingIgnore="true"
özelliğini ekleyin:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
Kullanım
Bir modül için görünüm bağlama etkinleştirilirse modülün içerdiği her XML düzen dosyası için bir bağlama sınıfı oluşturulur. Her bağlama sınıfı, kök görünüme ve kimliği olan tüm görünümlere referanslar içerir. Bağlama sınıfının adı, XML dosyasının adı Pascal büyük/küçük harflerine dönüştürülerek ve sonuna "Binding" kelimesi eklenerek oluşturulur.
Örneğin, aşağıdakileri içeren result_profile.xml
adlı bir düzen dosyası olduğunu varsayalım:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
Oluşturulan bağlama sınıfının adı ResultProfileBinding
. Bu sınıfın iki alanı vardır: name
adlı bir TextView
ve button
adlı bir Button
. Sayfada ImageView
öğesinin kimliği olmadığından bağlama sınıfında bu öğeye referans verilmez.
Her bağlama sınıfı, ilgili düzen dosyasının kök görünümü için doğrudan referans sağlayan bir getRoot()
yöntemi de içerir. Bu örnekte, ResultProfileBinding
sınıfındaki getRoot()
yöntemi LinearLayout
kök görünümünü döndürür.
Aşağıdaki bölümlerde, oluşturulan bağlama sınıflarının etkinliklerde ve parçalarda kullanımı gösterilmektedir.
Etkinliklerde görünüm bağlamayı kullanma
Bağlama sınıfının bir örneğini etkinlikle kullanmak için etkinliğin onCreate()
yönteminde aşağıdaki adımları uygulayın:
- Oluşturulan bağlama sınıfına dahil edilen statik
inflate()
yöntemini çağırın. Bu işlem, etkinliğin kullanacağı bağlama sınıfının bir örneğini oluşturur. getRoot()
yöntemini çağırarak veya Kotlin mülk söz dizimini kullanarak kök görünümün referansını alın.- Kök görünümü ekranda etkin görünüm yapmak için
setContentView()
'a iletin.
Bu adımlar aşağıdaki örnekte gösterilmektedir:
Kotlin
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
Java
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
Artık görünümlerden herhangi birine referans vermek için bağlama sınıfının örneğini kullanabilirsiniz:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Parçalarda görüntü bağlama kullanma
Bağlama sınıfının bir örneğini bir fragmanla kullanmak için fragmanın onCreateView()
yönteminde aşağıdaki adımları uygulayın:
- Oluşturulan bağlama sınıfına dahil edilen statik
inflate()
yöntemini çağırın. Bu işlem, parçanın kullanacağı bağlama sınıfının bir örneğini oluşturur. getRoot()
yöntemini çağırarak veya Kotlin mülk söz dizimini kullanarak kök görünümün referansını alın.- Ekrandaki etkin görünüm yapmak için
onCreateView()
yönteminden kök görünümü döndürün.
Kotlin
private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
Java
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
Artık görünümlerden herhangi birine referans vermek için bağlama sınıfının örneğini kullanabilirsiniz:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Farklı yapılandırmalar için ipuçları sağlayın
Birden fazla yapılandırmada görünümleri tanımlarken, belirli bir düzene bağlı olarak farklı bir görünüm türü kullanmak bazen mantıklı olabilir. Aşağıdaki kod snippet'inde buna örnek gösterilmektedir:
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
Bu durumda, oluşturulan sınıfın TextView
ortak temel sınıf olduğu için TextView
türüne sahip bir userBio
alanı göstermesini bekleyebilirsiniz. Teknik sınırlamalar nedeniyle görünüm bağlama kodu oluşturucu bunu belirleyemez ve bunun yerine bir View
alanı oluşturur. Bunun için alanın daha sonra binding.userBio as TextView
ile yayınlanması gerekir.
Bu sınırlamayı aşmak için görüntü bağlama, tools:viewBindingType
özelliğini destekler. Bu özellik, derleyiciye oluşturulan kodda hangi türün kullanılacağını bildirmenize olanak tanır.
Önceki örnekte, derleyicinin alanı TextView
olarak oluşturmasını sağlamak için bu özelliği kullanabilirsiniz:
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
Başka bir örnekte, biri BottomNavigationView
, diğeri NavigationRailView
içeren iki düzeniniz olduğunu varsayalım. Her iki sınıf da uygulama ayrıntılarının çoğunu içeren NavigationBarView
sınıfını genişletir. Kodunuzun mevcut düzende tam olarak hangi alt sınıfın bulunduğunu bilmesi gerekmiyorsa oluşturulan türü her iki düzende de NavigationBarView
olarak ayarlamak için tools:viewBindingType
kullanabilirsiniz:
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
Görüntü bağlama, kod oluştururken bu özelliğin değerini doğrulayamaz. Derleme ve çalışma zamanında hata oluşmaması için değerin aşağıdaki koşulları karşılaması gerekir:
- Değer,
android.view.View
sınıfından devralınan bir sınıf olmalıdır. Değer, yerleştirildiği etiketin üst sınıfı olmalıdır. Örneğin, aşağıdaki değerler kullanılamaz:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
Nihai tür, tüm yapılandırmalarda tutarlı bir şekilde çözülmelidir.
findViewById ile arasındaki farklar
Bağlama görüntüleme, findViewById
kullanmaya kıyasla önemli avantajlara sahiptir:
- Boş değer güvenliği: Görünüm bağlama, görünümlere doğrudan referanslar oluşturduğundan geçersiz bir görünüm kimliği nedeniyle boş işaretçi istisnası riski yoktur.
Ayrıca, bir görünüm yalnızca bir düzenin bazı yapılandırmalarında mevcut olduğunda, bağlama sınıfındaki referansını içeren alan
@Nullable
ile işaretlenir. - Tür güvenliği: Her bağlama sınıfındaki alanların türleri, XML dosyasında referans verdikleri görünümlerle eşleşir. Bu, sınıf yayınlama istisnası riski olmadığı anlamına gelir.
Bu farklılıklar, düzeniniz ile kodunuz arasındaki uyumsuzluklardan dolayı derleme işleminin çalışma zamanında değil derleme zamanında başarısız olduğu anlamına gelir.
Veri bağlamayla karşılaştırma
Hem görünüm bağlama hem de veri bağlama, görünümlere doğrudan referans vermek için kullanabileceğiniz bağlama sınıfları oluşturur. Ancak görünüm bağlama, daha basit kullanım alanlarını ele almak için tasarlanmıştır ve veri bağlamaya kıyasla aşağıdaki avantajları sağlar:
- Daha hızlı derleme: Görünüm bağlama işlemi için ek açıklama işleme gerekmediğinden derleme süreleri daha kısadır.
- Kullanımı kolay: Görüntü bağlama, özel olarak etiketlenmiş XML düzen dosyaları gerektirmez. Bu nedenle, uygulamalarınızda daha hızlı bir şekilde uygulanabilir. Bir modülde görüntü bağlamayı etkinleştirdiğinizde bu bağlama, söz konusu modülün tüm düzenleri için otomatik olarak uygulanır.
Öte yandan, görünüm bağlama, veri bağlamaya kıyasla aşağıdaki sınırlamalara sahiptir:
- Görünüm bağlama, düzen değişkenlerini veya düzen ifadelerini desteklemediğinden doğrudan XML düzen dosyalarından dinamik kullanıcı arayüzü içeriği tanımlamak için kullanılamaz.
- Görünüm bağlama, iki yönlü veri bağlamayı desteklemez.
Bu nedenle, bazı durumlarda bir projede hem görünüm bağlama hem de veri bağlama kullanmak en iyisidir. Gelişmiş özellikler gerektiren düzenlerde veri bağlamayı, gerektirmeyen düzenlerde ise görünüm bağlamayı kullanabilirsiniz.
Ek kaynaklar
Görünüm bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:
Bloglar
Videolar
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Kotlin sentetiklerinden Jetpack görünüm bağlamasına geçiş
- Düzenler ve bağlama ifadeleri
- Uygulama Mimarisi: Kullanıcı Arayüzü Katmanı - Başlangıç - Android Developers