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:

  1. 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.
  2. getRoot() yöntemini çağırarak veya Kotlin özelliği söz dizimi kullanarak kök görünüme referans alın.
  3. 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:

  1. 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.
  2. getRoot() yöntemini çağırarak veya Kotlin özelliği söz dizimi kullanarak kök görünüme referans alın.
  3. 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:

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