[Android] DataBinding
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