Bağlamayı göster Android Jetpack'in bir parçasıdır.

Bağlamayı görüntüleme, etkileşime giren kodları yazmayı kolaylaştıran bir özelliktir. 2 kat daha fazla. Görünüm bağlama, bir modülde etkinleştirildiğinde bağlama class ile değiştirin. Bağlama örneği sınıfı, kullanabilirsiniz.

Ç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. modülünde, viewBinding derleme seçeneğini true olarak ayarlayın build.gradle dosyası yükleyin:

Eski

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üzenin kök görünümüne tools:viewBindingIgnore="true" özelliği eklemek dosya:

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

Kullanım

Bir modül için görüntüleme bağlaması etkinleştirilmişse her modül için bir bağlama sınıfı oluşturulur Modülün içerdiği XML düzen dosyası. Her bağlama sınıfı referanslar içerir bir kimliği olan tüm görünümlere taşınır. Bağlama sınıfının adı: XML dosyasının adının Pascal biçimine dönüştürülüp "Bağlama" kelimesi sona erecektir.

Örneğin, result_profile.xml adında bir düzen dosyası ele alalım. şu:

<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 tane var alanları: name adlı bir TextView ve button adlı bir Button. İlgili içeriği oluşturmak için kullanılan Düzendeki ImageView öğesinin kimliği olmadığından bağlama sınıfını kullanır.

Her bağlama sınıfı bir getRoot() yöntemi de içerir ve doğrudan kök görünümüne ilişkin bir referans oluşturur. Bu örnekte ResultProfileBinding sınıfındaki getRoot() yöntemi şu değeri döndürür: LinearLayout kök görünümü.

Aşağıdaki bölümlerde, parçalardan bahsedeceğiz.

Etkinliklerde görünüm bağlamayı kullan

Bir etkinlikle kullanmak üzere bağlama sınıfının örneğini ayarlamak için etkinliğindeki adımları onCreate() yöntemi:

  1. Oluşturulan bağlama sınıfındaki 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 mülkünü kullanarak söz dizimi.
  3. Kök görünümünü setContentView() ekrandaki aktif görünüm yapın.

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 bağlama sınıfının örneğini kullanarak görünümlerden herhangi birine referans verebilirsiniz:

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ünüm bağlamayı kullan

Bir parçayla kullanılmak üzere bağlama sınıfının bir örneğini ayarlamak için aşağıdaki adımları izleyerek parçanın onCreateView() yöntem:

  1. Oluşturulan bağlama sınıfındaki 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.
  2. getRoot() yöntemini çağırarak veya Kotlin mülkünü kullanarak söz dizimi.
  3. onCreateView() yönteminden kök görünümünü döndürerek ekranda aktif görüntüleme.
ziyaret edin.

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 bağlama sınıfının örneğini kullanarak görünümlerden herhangi birine referans verebilirsiniz:

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ğlama

Birden fazla yapılandırmada görünümler bildirdiğinizde, belirli düzene bağlı olarak farklı bir görünüm türü kullanmak mantıklı olabilir. 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, oluşturulan sınıfın userBio alanını göstermesini bekleyebilirsiniz. türü TextView olduğundan TextView ortak temel sınıftır. Kaynak: görünüm bağlama kodu oluşturucu, bunu belirleyemez ve bunun yerine bir View alanı oluşturur. Bu, alanın daha sonra binding.userBio as TextView

Bu sınırlamayı aşmak için görünüm bağlaması tools:viewBindingType destekler. özelliği ile birlikte derleyiciye, oluşturulan kodda hangi türün kullanılacağını belirtmenizi sağlar. Yukarıdaki örnekte, derleyiciyi oluşturmak için bu özelliği kullanabilirsiniz. alanı TextView olarak oluşturabilirsiniz:

# 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, birisinde aşağıdakileri içeren iki düzeniniz olduğunu varsayalım: BottomNavigationView ve NavigationRailView içeren başka bir öğe. Her ikisi uygulamanın büyük kısmını içeren NavigationBarView sınıfları bolca fırsat sunuyor. Kodunuzun tam olarak hangi alt sınıfın mevcut olduğunu bilmesi gerekmiyorsa kullanıyorsanız, oluşturulan düzeni ayarlamak için tools:viewBindingType her iki düzende de NavigationBarView değerine yazın:

# 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ğlaması, kod oluşturulurken bu özelliğin değerini doğrulayamıyor. Alıcı: derleme zamanı ve çalışma zamanı hatalarından kaçının; değer, aşağıdaki gibi olmalıdır: koşullar:

  • 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, şu değerler işe yaramaz:

      <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ğlaması, findViewById kullanımına kıyasla önemli avantajlar sunar:

  • Null güvenlik: Görüntüleme bağlama, görüntülemelere 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 düzende, bağlama sınıfındaki referansını içeren alan @Nullable ile birlikte.
  • Tür güvenliği: Her bağlama sınıfındaki alanlar XML dosyasında referans verdikleri görünümler. Yani sınıf için herhangi bir risk yoktur. yayın istisnası.

Bu farklılıklar, düzeniniz ve kodunuz arasında uyumsuzluklar olduğu anlamına gelir derlemenizin çalışma zamanı yerine derleme zamanında başarısız olmasına neden olur.

Veri bağlama ile karşılaştırma

Bağlama ve veri bağlamayı görüntüleme bağlama sınıflarını inceleyelim. Ancak, bağlama, daha basit kullanım alanlarını ele almak üzere tasarlanmıştır ve aşağıdakileri sağlar: faydaları:

  • Daha hızlı derleme: Görünüm bağlama, ek açıklama işleme gerektirmediğinden derleme süreleri daha hızlıdır.
  • Kullanım kolaylığı: Görünüm bağlaması, özel olarak etiketlenmiş XML düzeni gerektirmez benimseyerek uygulamalarınıza uyarlayabilirsiniz. Şurada görüntüleme bağlamayı etkinleştirdikten sonra: söz konusu modülün tüm düzenleri için otomatik olarak geçerli olur.

Öte yandan görünüm bağlaması, verilere kıyasla aşağıdaki sınırlamalara sahiptir bağlama:

Bu noktalardan dolayı, bazı durumlarda, her iki görünümü de birlikte kullanmak bağlama ve veri bağlamayla ilgili bilgi edineceksiniz. Veri bağlamayı şu düzenlerde kullanabilirsiniz: gelişmiş özellikler gerektirmesi ve olmayan düzenlerde görünüm bağlamayı kullanması gerekir.

Ek kaynaklar

Görünüm bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın:

Örnekler

Bloglar

Videolar

ziyaret edin. ziyaret edin.