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:
- 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. getRoot()
yöntemini çağırarak veya Kotlin mülkünü kullanarak söz dizimi.- 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:
- 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. getRoot()
yöntemini çağırarak veya Kotlin mülkünü kullanarak söz dizimi.onCreateView()
yönteminden kök görünümünü döndürerek ekranda aktif görüntüleme.
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:
- Görünüm bağlaması düzen değişkenlerini veya düzeni desteklemiyor ifadeler, dolayısıyla kullanılamaz kullanarak dinamik kullanıcı arayüzü içeriğini doğrudan XML düzen dosyalarından bildirin.
- Görünüm bağlaması iki yönlü verileri desteklemiyor bağlama'yı tıklayın.
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.Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Kotlin sentetiklerinden Jetpack görünümü bağlamaya geçiş
- Düzenler ve bağlama ifadeleri
- Uygulama Mimarisi: Kullanıcı Arayüzü Katmanı - Başlarken - Android Geliştiricileri