Android

[Android] DataBinding

팽팽 2022. 10. 15. 15:11

findViewById

- 실시간으로 모든 리소스 트리를 뒤져서 해당 데이터를 찾아가야 함

- 실행도중에 발생하는 일이라 프로그램의 수행이 느리게 됨

 

-> 미리 바인딩 시켜놓고 직접 참조하면 일일이 찾아갈 필요가 없기 때문에 검색 오버레드가 줄어들음

 


데이터 바인딩 사용하기

1. build.gradle 파일 수정

dataBinding{
        enabled = true
    }

2. xml 파일 수정

- layout 태그로 전체를 감싸줌

- 데이터 바인딩의 사용설정을 해주면 레이아웃xml 파일과 연결되어 자동으로 설계되는 바인딩 클래스가 만들어짐

 

 

3. <data> 요소

- 뷰들과 연결되어 보여줄 데이터를 가진 데이터 클래스 지정후 레이아웃 파일 안에서 사용할 식별명 정해주는 요소

<?xml version="1.0" encoding="utf-8"?>
<!-- Data Binding의 root는 <layout> -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
    <data>
        
    </data>


    <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp">

    </LinearLayout>

</layout>
출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

User.class

- 앱에 사용될 데이터를 저장할 변수를 가진 클래스 

public class User{
	
    //TextView에서 보여줄 데이터를 저장하고 있을 변수
    String name;
    
    //생성자메소드
    public User(String name){
    	this.name = name;
    }
    
}
출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

- <data> 안에 <variable>에 변수 선언해줌

<?xml version="1.0" encoding="utf-8"?>
<!-- Data Binding의 root는 <layout> -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
    <data>
        <!-- 데이터바인딩으로 연결할 User클래스 객체를 이 레이아웃에서는 user 라는 이름으로 참조하여 사용하겠다는 설정  -->
        <variable
            name="user" // 개발자가 지정
            type="com.kitesoft.databindingjava.User" />

    </data>


    <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp">

    </LinearLayout>

</layout>
출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

 

- @{user.name} 으로 textview에 띄울 text값을 변수로 지정하기

<?xml version="1.0" encoding="utf-8"?>
<!-- Data Binding의 root는 <layout> -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
    <data>
        <!-- 데이터바인딩으로 연결할 User클래스 객체를 이 레이아웃에서는 user 라는 이름으로 참조하여 사용하겠다는 설정  -->
        <variable
            name="user"
            type="com.kitesoft.databindingjava.User" />

    </data>


    <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp">

        <!-- 텍스트뷰의 글씨를 <data>태에서 지정한 <variable>그 요소의 User객체의 멤버값 사용 -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="@{user.name}"/>

    </LinearLayout>

</layout>
출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

 

4. MainActivity.java

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

import android.os.Bundle;

import com.kitesoft.databindingjava.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

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

        //DataBindingUtil클래스를 통해 이 MainActivity에게 activit_main.xml 레이아웃을 ContentView()로 설정하고 연결하여 제어하는 클래스객체를 리턴
        //클래스의 이름의 xml레이아웃 파일명을 기준으로 자동으로 설계되어 만들어짐. [ex. activity_main.xml 이면 ActivityMainBinding,  activity_intro.xml 이면 ActivityIntroActivityBinding ]
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        //xml문서의 <data>요소 안에 있는 <variable>의 type에 지정한 클래스 객체를 만들어 set()해주면 레이아웃파일의 뷰들에 설정한 객체의 값들이 반영됨
        binding.setUser(new User("sam")); //초기값으로 지정할 User객체 생성 및 바인딩객체에게 설정

    }
}
출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

 

* 정리 *

자바에서 뷰들을 findViewById()와 같은 방법으로 참조하여 값을 설정하는 것이 아니라

데이터를 가진 클래스 (User) 객체를 만들고 xml레이아웃에서 미리 연결만 해 놓으면 알아서 UI에 적용되도록 하는 기법

 

: 뷰에게 특정 변수를 설정(연결) 하고 그 변수의 값을 바꿈


이때 우리가 일반적으로 사용하는 String이나 int같은 자료형의 변수를 이용하면 연결되어 뷰에 보여지기는 하지만,

변수값을 바꾸어도 뷰가 이를 자동으로 인지하여 화면을 갱신하지 않음

-> 일반적인 자료형의 변수가 아니라 관찰(Observe)이 가능한 자료형의 변수를 만들어서 뷰들에 연결해야함

-> Observale 변수

 

1) 자바의 primitive 자료형(기본 자료형) 인 boolean ~ double에 대응되는 ObservableBoolean ~ ObservableDouble

2) List 또는 Map 컬렉션에 대응되는 ObservableList or ObservableMap

3) String이나 Item같은 자바의 참조형 타입들에 대응되는 ObservableField<XXX> : <>제네릭안에 참조형 타입명 지정

 

 

1. User.java

import androidx.databinding.ObservableBoolean;
import androidx.databinding.ObservableField;
import androidx.databinding.ObservableInt;

public class User {

    //값 변경이 관찰되는 멤버변수 ObservableXXX : primitive type XXX && List Or Map  && Reference type is ObservableField<>
    public ObservableField<String> name= new ObservableField<>();
    public ObservableInt age= new ObservableInt();
    public ObservableBoolean fav= new ObservableBoolean();
    

    //constructor
    public User(String name, int age, boolean fav) {
    	//파라미터로 받은 일반적인 자료형을 ObservableXXX 변수에 대입해주기 위해 .set()메소드 이용 - 자료형이 다르기에 대입연산자(=)로 값 저장불가
        this.name.set(name);
        this.age.set(age);
        this.fav.set(fav);
    }

}
출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

2. Activity 코드와 xml 코드는 따로 수정하지 않음

3. 버튼 추가 후, 버튼 클릭시에 User 클래스의 name 변수값 변경하기

- onClick속성에 @{user::메소드명} 으로 설정하면 해당 메소드가 클릭이벤트에 반응하여 자동 호출

 

<Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="change name"
            android:onClick="@{user::changeName}"/>

출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

 

package com.kitesoft.databindingjava;

import android.view.View;
import android.widget.CompoundButton;
import android.widget.Toast;

import androidx.databinding.ObservableBoolean;
import androidx.databinding.ObservableField;
import androidx.databinding.ObservableInt;

public class User {

    //값 변경이 관찰되는 멤버변수 ObservableXXX : primitive type XXX && List Or Map  && Reference type is ObservableField<>
    public ObservableField<String> name= new ObservableField<>();
    public ObservableInt age= new ObservableInt();
    public ObservableBoolean fav= new ObservableBoolean();


    //constructor
    public User(String name, int age, boolean fav) {
        this.name.set(name);
        this.age.set(age);
        this.fav.set(fav);
    }

    //change name click callback method : onclick속성에 반응하는 액티비티의 콜백메소드 작업을 데이터가 있는 이 클래스에서 코
    public void changeName(View view){
        name.set("ROBIN"); //Observable객체들의 값 변경은 반드시 set()을 해야 자동 값 갱신이 이루어짐 [ ObservableXXX 객체들은 어차피 = 대입연산자 사용 못함]
    }

}
출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

 

 

 

 

 

 

https://arvigoes.tistory.com/108

 

11. Data Binding (데이터 바인딩) - Android Studio (안드로이드)

데이터 바인딩을 사용하지 않으면 findViewById 같은 함수를 통해 실시간으로 모든 리소스 트리 를 뒤져서 해당 데이터를 찾아가야 합니다. 실시간이라면 실행도중에 발생하는 일이라 프로그램의

arvigoes.tistory.com

https://kitesoft.tistory.com/118?category=549069 

 

[안드로이드 Android] 데이터 바인딩 Data Binding #2 - 버튼클릭이벤트 처리하기

이번 글에서는 데이터바인딩에 대한 2번째 실습으로 버튼을 클릭하였을때 TextView의 글씨가 바뀌도록 해보겠습니다. 실제 앱개발 과정에서 가장 빈번하게 작업하는 유형입니다. 특정 이벤트가

kitesoft.tistory.com