Sitemap

Android View Binding & Data Binding Nedir?

4 min readSep 26, 2023

--

Press enter or click to view image in full size

Merhabalar,

Geliştirdiğimiz projelerde; her daim daha verimli, kolay okunabilir, geliştirilebilir olmasına dikkat edilmeli ve yazılım dillerinin bize sunduğu özelliklerin ihtiyaç olduğu durumlarda projemizi iyiye götürmek amacı ile kullanmamız gerekmektedir.

Şimdi de birlikte bu özelliklerden biri olan View Binding ve Data Binding konusunu örnekler ile inceleyelim.

Her ikisi için genel bir açıklama yapacak olursak: Android uygulamalarda UI bileşenlerini daha verimli şekilde yönetmemize ve bu bileşenleri bağlamamıza yardımcı olmaktadırlar.

View Binding Nedir?

View Binding 2019 yılında Google IO etkinliklerinde duyurulmasıyla yazılım dünyamıza giriş yaptı. View Binding öncesinde kodumuz ilgili olduğu layout xml dosyasında bulunan viewlere findViewById ile erişilip her bir view için ayrı ayrı tanımlama yapılırdı. View binding sayesinde bir kere tanımlamamız yeterli olacaktır. Peki bu işlemi nasıl yaparız? Hadi başlayalım.

  • Not: View Binding için null safety özelliği ve type safety özelliği vardır. Bu sebeple UI bileşenlerine null kontrolü yapmamız gerekmez. Null Pointer Exceptions gibi hataları önlemeye yardımcı olur.

Öncelikle projemizin build.gradle(module) dosyasına android dizininin içerisine binding kodumuzu eklemeliyiz.

  viewBinding {
enabled = true
}

Bu sayede artık her bir layout.xml dosyamız için kendine ait adı olacak. nasıl mı?

Normal şartlarda binding öncesi activity içerisinde activity_main.xml ile ulaşırdık ama artık ActivityMainBinding ile ulaşabiliriz. Şimdi xml dosyamıza birkaç view ekleyelim.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textView"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Geldik elimizdeki layout.xml dosyamızı activity içerisine bind etmeye ilk adım için değişkenimizi tanımlamalıyız.

private ActivityMainBinding binding; // Binding değişkenimizi tanımladık.

ActivityViewBinding ,View Binding tarafından otomatik olarak oluşturulur ve projedeki layout dosyalarımıza karşılık gelir. Bu sayede layout dosyasındaki UI bileşenlerine daha kolay erişebiliriz.

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);

// Şimdi View Binding ile UI bileşenlerine erişebiliriz.

binding.textView.setText("Java View Binding Örneği");

binding.button.setOnClickListener(v -> Toast.makeText(v.getContext(), "Butona tıklandı.", Toast.LENGTH_LONG).show());
}

Evett Activity için view binding işlemi yaptık. Peki Fragment için yapmak istersek nasıl geliştirme yapacağız? Şimdi de beraber bu durumu inceleyelim.

Fragment icin View Binding

View Binding işlemi aslında Activity tarafına yaptığımız geliştirme ile çok benzerdir.

Projemizin build.gradle(module) dosyasına binding eklendimizi android dizini içerisine yerleştirelim. Sonrasında layout.xml dosyası içerisine UI bileşenimizi ekleriz. IU bileşenini eklemek istememin sebebi nasıl bind ettiğimizi görebilmek. Buraya kadar kod olarak aynıdır Activity bölümünden bakabilirsiniz.

public class MainFragment extends Fragment {
private FragmentMainBinding binding; // Binding değişkenimizi tanımladık.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

binding = FragmentMainBinding.inflate(inflater, container, false);
View view = binding.getRoot();

binding.fragmentText.setText("Fragment için view binding işlemi yaptık");
//xml dosyam içerisindeki TextView bileşenimi binding işlemini gerşekleştirdim.

return view;
}
}

Data Binding ile devam edelim..

Data Binding Nedir?

Yazımın başındaki açıklamada da dediğim gibi her ikisi de aynı talebe hizmet etmektedir. Data Binding, layout.xml dosyasındaki UI bileşenlerini veri kaynaklarına bağlama işlemidir. Bu durum, UI’nin otomatik olarak veri kaynaklarındaki değişikliklere yanıt vermesini sağlar.

Get Ece Akıllı Arıöz’s stories in your inbox

Join Medium for free to get updates from this writer.

Öncelikle projemizin build.gradle(module) dosyasına android dizininin içerisine binding kodumuzu eklemeliyiz.

dataBinding {
enabled = true
}

Daha sonra XML dosyamıza gelerek mac için option+enter window bilgisayarlar için alt+enter tuşuna basarak bize önerdiği ‘convert to data binding layout’ seçeneğine tıklayarak layoutu istediğimiz pozisyona getiriyoruz.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="userName"
type="String" />

</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userName}"
tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Layout.xml bu forma getirdikten sonra <data> taglerini görüyoruz. Bu tagler arasına kullanacağımız modelimizi belirtiyoruz. TextView için kullanacağız ve text alanına “@{userName}” belirtmeyi unutmuyoruz.

Activity içerisinde nasıl bind ediyoruz ona bakalım.

public class MainActivity2 extends AppCompatActivity {
private ActivityMain2Binding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = DataBindingUtil.setContentView(this, R.layout.activity_main2);
String userName = "John";

binding.setUserName(userName);
}
}

Bir diğer hususa gelirsek type olarak nasıl string belirlediysek bir veri classı olarak da belirleyebiliriz. O halde kodlarımızı veri classına göre derleyelim.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="userName"
type="com.example.viewbindingdatabinding.User" />

</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userName.name}"
tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Type parametresini package name + class name olarak yazalım. TextView bileşenimizin textinde artık User classımızda bulunan name değişkeni ile tamamlıyoruz. User classımıza beraber göz atalım.

public class User {
public String name;

public User(String name) {
this.name = name;
}
}

Artık verimiz bağlı durumda bir sonraki adımımız verimizi Activitye bağlamak ve nasıl kullanırız bakalım.

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ActivityMain2Binding activityMainBinding =
DataBindingUtil.setContentView(
this, R.layout.activity_main2);

User person = new User("Ece");

activityMainBinding.setUserName(person);
}

Burada User sınıfından nesne ürettik. Artık layout.xml dosyamızın data binding ile User sınıfından bir değişkeni bağlamış olduk.

View Binding ile Data Binding arasındaki net farklar;

  • View Binding, daha basit ve hızlı öğrenilebilir bir yapıya sahipken, Data Binding daha karmaşık bir yapıya sahiptir.
  • Data Binding, layout ile veriyi bağlamak için tasarlanmıştır. Bu, verilerin otomatik olarak UI ile senkronize olmasını sağlar ama View Binding de bu durumu manuel olarak yapmanız gerekecektir.

Genel olarak konumuzu toparlayacak olursak;

Hangi binding yöntemini kullanacağınız , projenizin gereksinimlerine ve karmaşıklığına bağlıdır. Daha basit projelerde View Binding yeterli olabilirken, daha büyük ve karmaşık projelerde Data Binding daha fazla avantaj sunabilir.

Makalemizi son olarak Metotlarımızın bulunduğu tablo ile sonlandıralım.

Press enter or click to view image in full size

Bir sonraki konumuzda görüşmek dileğiyle.

--

--