Bağlamayı görüntüleyin Android Jetpack'in bir parçasıdır.
Görünüm bağlama, görünümlerle etkileşime giren kod yazmayı kolaylaştıran bir özelliktir. Görünüm bağlama bir modülde etkinleştirildiğinde, bu modülde bulunan her XML düzen dosyası için bir bağlama sınıfı oluşturulur. Bağlama sınıfı örneği, karşılık gelen düzende kimliği olan tüm görünümlere doğrudan referanslar içerir.
Çoğu durumda, görünüm bağlaması findViewById
öğesinin yerini alır.
Kurulum
Görünüm bağlama modül bazında etkinleştirilir. Bir modülde görünüm bağlamayı etkinleştirmek için aşağıdaki örnekte gösterildiği gibi, modül düzeyindeki build.gradle
dosyasında viewBinding
derleme seçeneğini true
olarak ayarlayın:
Modern
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
Bağlama sınıfları oluştururken 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ştirildiyse 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'a dönüştürülüp sonuna "Binding" kelimesi eklenerek oluşturulur.
Örneğin, result_profile.xml
adlı ve aşağıdaki bilgileri içeren bir düzen dosyasını ele alalı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ı ResultProfileBinding
olarak adlandırılır. Bu sınıfta iki alan vardır: name
adlı TextView
ve button
adlı Button
. Düzendeki ImageView
kimliği olmadığından bağlama sınıfında buna herhangi bir başvuru yoktur.
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
Bir etkinlikle kullanmak üzere bağlama sınıfının bir örneğini oluşturmak 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 özelliği söz dizimi kullanarak kök görünüme referans alın.- Ekranda aktif görünüm yapmak için kök görünümü
setContentView()
hizmetine geçirin.
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 başvuruda bulunmak 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çalar halinde görünüm bağlamayı kullanma
Bir parçayla kullanmak üzere bağlama sınıfının bir örneğini ayarlamak için parçanı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 kullanılması için bağlama sınıfının bir örneğini oluşturur. getRoot()
yöntemini çağırarak veya Kotlin özelliği söz dizimi kullanarak kök görünüme referans alın.- Ekranda 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 başvuruda bulunmak 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 çok yapılandırmada görünümler bildirdiğinizde, belirli bir düzene bağlı olarak farklı bir görünüm türü kullanmak bazen mantıklıdır. Aşağıdaki kod snippet'inde bunun bir örneği 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, TextView
yaygın temel sınıf olduğu için oluşturulan sınıfın TextView
türünde bir userBio
alanını göstermesini bekleyebilirsiniz. Teknik sınırlamalardan dolayı, görünüm bağlama kodu oluşturma aracı bunu tespit edemez ve bunun yerine bir View
alanı oluşturur. Bunun için daha sonra alanın binding.userBio as TextView
ile yayınlanması gerekir.
Bu sınırlamayı aşmak için görünüm bağlama, bir tools:viewBindingType
özelliğini destekler. Bu sayede derleyiciye, oluşturulan kodda ne türün kullanılacağını bildirirsiniz.
Ö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
kapsamını genişletir. Kodunuzun geçerli düzende tam olarak hangi alt sınıfın olduğ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ünüm bağlama, kod oluşturulurken bu özelliğin değerini doğrulayamaz. Derleme zamanı ve çalışma zamanı hatalarını önlemek için değerin aşağıdaki koşulları karşılaması gerekir:
- Değer,
android.view.View
öğesinden devralan 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 geçerli olmaz:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
Son tür, tüm yapılandırmalarda tutarlı bir şekilde çözümlenmelidir.
findViewById ile arasındaki farklar
Görünüm bağlamanın, findViewById
kullanımına kıyasla önemli avantajları vardır:
- Null güvenliği: Görünüm bağlama, görünümlere doğrudan referanslar oluşturduğundan geçersiz görüntüleme kimliği nedeniyle boş işaretçi istisnası riski yoktur.
Buna ek olarak, bir görünüm bir düzenin yalnızca bazı yapılandırmalarında mevcut olduğunda, bağlama sınıfında bu görünümün referansını içeren alan
@Nullable
ile işaretlenir. - Tür güvenliği: Her bağlama sınıfındaki alanlar, XML dosyasında referans verdikleri görünümlerle eşleşen türlere sahiptir. Bu, sınıf yayınlama istisnasının hiç olmadığı anlamına gelir.
Bu farklılıklar, düzeniniz ile kodunuz arasındaki uyumsuzluklar anlamına gelir. Sonuç olarak derlemeniz, çalışma zamanında değil, derleme zamanında başarısız olur.
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 başvuruda bulunmak 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, ek açıklama işleme gerektirmez, bu nedenle derleme süreleri daha hızlıdır.
- Kullanım kolaylığı: Görünüm bağlama, özel olarak etiketlenmiş XML düzen dosyaları gerektirmediğinden uygulamalarınızda benimsenmesi daha hızlıdır. Bir modülde görüntüleme bağlamayı etkinleştirdiğinizde, bu işlem söz konusu modülün tüm düzenlerine otomatik olarak uygulanır.
Diğer yandan, görünüm bağlamada, veri bağlamaya kıyasla aşağıdaki sınırlamalar vardır:
- Görünüm bağlama, düzen değişkenlerini veya düzen ifadelerini desteklemediğinden, dinamik kullanıcı arayüzü içeriğini doğrudan XML düzen dosyalarından tanımlamak için kullanılamaz.
- Görünüm bağlama, iki yönlü veri bağlamayı desteklemez.
Bu önemli noktalar nedeniyle, bazı durumlarda bir projede hem görünüm bağlamayı hem de veri bağlamayı kullanmak en iyisidir. Gelişmiş özellikler gerektiren düzenlerde veri bağlama, zorunlu olmayan düzenlerde ise görünüm bağlama kullanabilirsiniz.
Ek kaynaklar
Görünüm bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:
Sana Özel
Bloglar
Videolar
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Kotlin sentezinden Jetpack görünüm bağlamasına geçiş
- Düzenler ve bağlama ifadeleri
- Uygulama Mimarisi: Kullanıcı Arayüzü Katmanı - Başlarken - Android Geliştiricileri