-
[Android] DataBindingAndroid 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
https://kitesoft.tistory.com/118?category=549069
'Android' 카테고리의 다른 글
[Android] MVVM 패턴 적용 - ACC 예제 (0) 2022.10.11 [Android] MVVM 패턴 적용 - ACC (0) 2022.10.10