코코딩딩

[안드로이드] DataBinding 본문

코딩/Android

[안드로이드] DataBinding

겟츄 2022. 3. 31. 22:35

MVVM 디자인 패턴에 대해 이해하고 당장 정리하고 싶지만 당장의 실력으로는 깔끔한 정리가 어려울 것 같아 당장 사용할 수 있는 코드들을 연습해보면서 이해하고자 한다.

 


DataBinding

데이터 바인딩은 button이나 editText등 레이아웃의 구성요소들을 findViewByid()를 이용해 호출하는 것이 아닌 선언적형식으로 데이터소스와 결합할 수 있는 라이브러리이다.

 

databinding을 사용하기 위해선 gradle에 다음과 같은 코드를 작성해주어야 한다.

android {
    dataBinding {
        enabled = true
    }
}

또한 layout.xml에 기존 코드들을 <layout>으로 감싸고 xmlns 들을 <layout>에 넣어준다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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">
    <androidx.constraintlayout.widget.ConstraintLayout
        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:layout_marginTop="350dp"
            android:text="Hello World!"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/btnTest"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:text="버튼"
            app:layout_constraintEnd_toEndOf="@+id/textView"
            app:layout_constraintStart_toStartOf="@+id/textView"
            app:layout_constraintTop_toBottomOf="@+id/textView" />

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

MainActivity

package com.example.ex01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingComponent;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;
import android.view.View;

import com.example.ex01.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //버튼 눌렀을때 동작할 코드
            }
        });
    }
}

gradle에 databinding을 추가하고 레이아웃xml에 <layout>을 추가했다면 ActivityMainBinding을 다 치기전에 자동완성이 될 것이다. 이는 activity의 이름에 따라 자동생성되는 이름이다.

선언한 binding에 DataBindingUtil.setContentView(this,R.layout.activity_main); 을 넣어주면 레이아웃과 연결된다.

이후 binding. 을 하면 자신이 추가한 레이아웃의 요소들의 id 목록이 보일것이다.

 

*발생한 오류*

프로젝트를 만들다가 ActivityMainBindeingImpl 나 bindingmapper 에 오류가 뜨는 경우가 있었다.

본인의 경우 mViewModel에 문제가 있다는 내용이 주로 나왔는데 프로젝트 클린으로 해결이 되었다.