괴발개발

[Android] About DataBinding 본문

Study/Android Studio

[Android] About DataBinding

yousim 2022. 4. 14. 13:35

findViewByid()는 안 쓴지 꽤 되었다. 

findViewByid 에 대한 공식문서의 설명은 이와 같다.

 

만약 MainActivity.java에서 activity_main.xml의 버튼 한개를 findViewByid 로 정의한다고 하면, 이렇게 된다. 

 

activity_main.xml

<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">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

MainActivity.java

package com.example.fragment;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button button;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),"this is button",Toast.LENGTH_SHORT).show();
            }
        });
    }


}

 

위 코드 처럼 findViewByid를 사용할 땐 

 

button = findViewByid(R.id.btn) 

 

이렇게 정의해야한다. 

 

정의해야할 요소가 몇개 안 된다면 괜찮지만 만약 버튼이 100개, 200개..늘어간다면 하나하나 정의하는 과정은 쓸데없이 시간낭비만 한다. 

 

이런 단점을 보완하기 위해 만들어진것이 바로 DataBinding이다. 

 

DataBinding :

xml 파일의 data를 binding(연결) 하여 사용 가능한 기능이다. 

이 방법을 사용하면 모든 요소마다 정의를 해야했던 findViewByid와 달리 코드 간소화가 가능하다. 

 

 

DataBinding 실행방법 

 

1.

 

 build.gradle은 Project, Module 두 개의 파일로 나뉜다. 이때 

build.gradle(Project: ...) : 모든 서브 프로젝트, 모듈에 적용되는 최상위 빌드 파일이며, common configs를 포함하여야함.

 

build.gradle(Module: ...)은:  해당 모듈에만 적용되는 구성 파일 >> 데이터 바인딩에 대한 권한은 이쪽에 적용하는게 맞음.

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    dataBinding {
        enabled true
    }
}

build:gradle(module)의 android { } 안에 넣어준다. 

 

 

 

2. activity_main.xml의 코드를

<layout> 으로 감싸고 난뒤, 안에 <data> <variable> 태그를 넣는다. 

이때 type은 package path를 넣으면 된다. 

<?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">
    
    <data>
        <variable
            name="main"
            type="com.example.fragment.MainActivity" />
    </data>

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

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

 

3. 

2에서 <data>를 넣어줌에 따라 자동으로 생성된 ActivityMainBinding 자료형으로 binding을 정의한다. 

기존에 oncreate안에  정의되어있던 setContentView(R.layout.activity_main)을 삭제하고, 

binding을 사용하면 앞서 만든 기능 그대로 사용 가능하다.

 

package com.example.fragment;

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

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.fragment.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.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),"test",Toast.LENGTH_SHORT).show();
                
            }
        });
    }


}

 

참고) https://roomedia.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%94%EC%9D%B8%EB%94%A9-in-Java