Skip to content

Latest commit

Β 

History

History
451 lines (317 loc) Β· 15.9 KB

DataBinding_sieun.md

File metadata and controls

451 lines (317 loc) Β· 15.9 KB

Data Binding

λ°œν‘œμ£Όμ œ : Data Binding

λ°œν‘œμΌμž : 2018-07-30 (μ›”)

λ°œν‘œμž : μ†‘μ‹œμ€

[TOC]

0. μ°Έκ³ λ¬Έμ„œ

1. μ •μ˜

데이터 바인딩 라이브러리

λ ˆμ΄μ•„μ›ƒμ˜ UI ꡬ성 μš”μ†Œλ₯Ό ν”„λ‘œκ·Έλž˜λ° 방식이 μ•„λ‹Œ μ„ μ–Έ ν˜•μ‹μ„ μ‚¬μš©ν•˜μ—¬ μ•±μ˜ 데이터 μ†ŒμŠ€μ— 바인딩 ν•  수 μžˆλŠ” 지원 라이브러리

1.1. νŠΉμ§•

  • μ•‘ν‹°λΉ„ν‹°μ—μ„œ λ§Žμ€ UI ν”„λ ˆμž„ μ›Œν¬ ν˜ΈμΆœμ„ 제거 ν•  수 μžˆμœΌλ―€λ‘œ μœ μ§€ 관리가 더 쉽고 간단해진닀.
  • μ•±μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κ³  λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ 널 포인터 μ˜ˆμ™Έλ₯Ό 방지 ν•  수 μžˆλ‹€.
  • 데이터 바인딩 λΌμ΄λΈŒλŸ¬λ¦¬λŠ”Β Android JetpackΒ μ•„ν‚€ν…μ²˜ ꡬ성 μš”μ†Œμ΄λ‹€.
  • Android 2.1(API 레벨 7 이상)κΉŒμ§€ Android ν”Œλž«νΌμ˜ λͺ¨λ“  이전 λ²„μ „μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • Android Plugin for GradleΒ 1.5.0-alpha1 이상이 ν•„μš”ν•˜λ‹€.
  • Android Studio 1.3 μ΄μƒμ—μ„œλŠ” 데이터 바인딩 μ½”λ“œλ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ μ½”λ“œ νŽΈμ§‘ κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.
    • ꡬ문 κ°•μ‘°ν‘œμ‹œ
    • 식 μ–Έμ–΄ ꡬ문 였λ₯˜μ˜ ν”Œλž˜κ·Έ 지정
    • XML μ½”λ“œ μ™„μ„±
    • (μ„ μ–Έ 탐색 λ“±μ˜) 탐색과 λΉ λ₯Έ λ¬Έμ„œν™”λ₯Ό ν¬ν•¨ν•œ μ°Έμ‘°
  • 데이터 바인딩 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ³€κ²½ 사항에 λŒ€ν•œ 데이터λ₯Ό μ‰½κ²Œ κ΄€μ°° ν•  μˆ˜μžˆλŠ” ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

1.2. 클래슀 바인딩을 μœ„ν•œ μƒˆλ‘œμš΄ 데이터 바인딩 컴파일러

Android Gradle ν”ŒλŸ¬κ·ΈμΈ 버전 3.1.0-alpha06 에 바인딩 클래슀λ₯Ό μƒμ„±ν•˜λŠ” μƒˆλ‘œμš΄ 데이터 바인딩 μ»΄νŒŒμΌλŸ¬κ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€. μƒˆλ‘œμš΄ μ»΄νŒŒμΌλŸ¬λŠ” 바인딩 클래슀λ₯Ό μ μ§„μ μœΌλ‘œ μƒμ„±ν•œλ‹€.

  • λŒ€λΆ€λΆ„μ˜ 경우 λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€μ˜ 속도가 빨라진닀.

  • 이전 λ²„μ „μ˜ 데이터 바인딩 μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œκ°€ μ»΄νŒŒμΌλ˜λŠ” λ™μΌν•œ λ‹¨κ³„μ—μ„œ 바인딩 클래슀λ₯Ό μƒμ„±ν–ˆλ‹€. λ”°λΌμ„œ μ½”λ“œκ°€ μ»΄νŒŒμΌλ˜μ§€ μ•ŠμœΌλ©΄ 바인딩 클래슀λ₯Ό 찾을 수 μ—†λ‹€λŠ” 였λ₯˜κ°€ ν‘œμ‹œλ  수 μžˆλ‹€. μƒˆλ‘œμš΄ 데이터 바인딩 μ»΄νŒŒμΌλŸ¬λŠ” 관리 μ»΄νŒŒμΌλŸ¬κ°€ 앱을 λΉŒλ“œν•˜κΈ° 전에 바인딩 클래슀λ₯Ό μƒμ„±ν•˜μ—¬ 였λ₯˜ λ°©μ§€ν•œλ‹€.

  • μƒˆλ‘œμš΄ 데이터 바인딩 컴파일러λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ gradle.properties νŒŒμΌμ— λ‹€μŒ μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ λœλ‹€.

    android.databiding.enableV2=true
    -Pandroid.databinding.enableV2=true

  • μ•ˆλ“œλ‘œμ΄λ“œ ν”ŒλŸ¬κ·ΈμΈ 버전 3.1의 μƒˆλ‘œμš΄ 데이터 바인딩 μ»΄νŒŒμΌλŸ¬λŠ” 이전 버전과 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€. 증뢄 μ»΄νŒŒμΌμ„ ν™œμš©ν•˜λ €λ©΄ 이 κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” λͺ¨λ“  바인딩 클래슀λ₯Ό μƒμ„±ν•΄μ•Όν•œλ‹€.

  • μ•ˆλ“œλ‘œμ΄λ“œ ν”ŒλŸ¬κ·ΈμΈ 버전 3.2의 μƒˆλ‘œμš΄ μ»΄νŒŒμΌλŸ¬λŠ” 이전 λ²„μ „μ—μ„œ μƒμ„±λœ 바인딩 ν΄λž˜μŠ€μ™€ ν˜Έν™˜λœλ‹€. 버전 3.2의 μƒˆλ‘œμš΄ μ»΄νŒŒμΌλŸ¬λŠ” 기본적으둜 ν™œμ„±ν™” λ˜μ–΄μžˆλ‹€.

2. μ‹€μŠ΅

2.1. λΉŒλ“œν™˜κ²½

μ•± λͺ¨λ“ˆμ˜Β build.gradleΒ νŒŒμΌμ—Β dataBindingΒ μš”μ†Œλ₯Ό μΆ”κ°€

android {
    ...
    dataBinding {
        enable = true
    }
}

2.2. Data Object - POJO(plain-old java object)

public class User {
    private final String firstName;
    private final String lastName;
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    public String getFirstName() {
        return this.firstName;
    }
    public String getLastName() {
        return this.lastName;
    }
}

2.3. 데이터 바인딩 λ ˆμ΄μ•„μ›ƒ 파일

데이터 바인딩 λ ˆμ΄μ•„μ›ƒ νŒŒμΌμ€ layout 의 루트 νƒœκ·Έλ‘œ μ‹œμž‘ν•˜κ³  κ·Έ 뒀에 data μš”μ†Œμ™€ view 루트 μš”μ†Œκ°€ λ‚˜μ˜¨λ‹€.

<?xml version="1.0" encoding="utf-8"?>
<layout 
   xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

2.4. 데이터 바인딩

데이터 바인딩 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ ˆμ΄μ•„μ›ƒμ˜ λ·°λ₯Ό 데이터 객체와 λ°”μΈλ”©ν•˜λŠ” 데 ν•„μš”ν•œ 클래슀λ₯Ό μžλ™μœΌλ‘œ 생성

파슀칼 ν‘œκΈ°λ²•(ν•©μ„±μ–΄μ˜ 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ ν‘œκΈ°)으둜 λ³€ν™˜ν•˜κ³  뒀에 "Binding" 접미사λ₯Ό μΆ”κ°€

ex) R.layout.activity_main -> ActivityMainBinding.class

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("Test", "User");
        User user1 = new User("asdf", "qwer");
        binding.setUser(user1);
    }

3. μ‘μš©

3.1. 이벀트 처리

ν‘œν˜„μ‹ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ λ·°μ—μ„œ μ „λ‹¬ν•œ 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν‘œν˜„μ‹μ„ μž‘μ„±ν•  수 μžˆλ‹€. 이벀트 νŠΉμ„± 이름은 λͺ‡ 가지 μ˜ˆμ™Έλ₯Ό μ œμ™Έν•˜λ©΄ λ¦¬μŠ€λ„ˆ λ©”μ„œλ“œμ˜ 이름에 따라 κ²°μ •λœλ‹€.

ex) View.OnLongClickListenerμ—λŠ” λ©”μ„œλ“œ onLongClick()이 μžˆμœΌλ―€λ‘œ, 이 μ΄λ²€νŠΈμ— λŒ€ν•œ νŠΉμ„±μ€ android:onLongClick이닀.

λ‹€μŒ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 이벀트λ₯Ό 처리 ν•  수 μžˆλ‹€.

3.1.1. λ©”μ†Œλ“œ μ°Έμ‘°

Activity에 μžˆλŠ” λ©”μ„œλ“œμ— android:onClick을 ν• λ‹Ήν•˜λŠ” 것과 λΉ„μŠ·ν•œ λ°©λ²•μœΌλ‘œ 이벀트λ₯Ό ν•Έλ“€λŸ¬ λ©”μ„œλ“œμ— 직접 바인딩 ν•  수 μžˆλ‹€. onClick 속성과 비ꡐ할 λ•Œ κ°€μž₯ 큰 이점은 ν‘œν˜„μ‹μ΄ 컴파일 μ‹œμ μ— μ²˜λ¦¬λœλ‹€λŠ” 것이닀. λ”°λΌμ„œ λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ μ„œλͺ…이 μ˜¬λ°”λ₯΄μ§€ μ•ŠμœΌλ©΄ 컴파일 μ‹œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

  • ν•Έλ“€λŸ¬μ— 이벀트λ₯Ό μ§€μ •ν•˜λ €λ©΄ 호좜 ν•  λ©”μ†Œλ“œ 이름인 κ°’μœΌλ‘œ 일반 바인딩 ν‘œν˜„μ‹μ„ μ‚¬μš©ν•œλ‹€.
public class MyHandlers {
    public void onClickFriend(View view) { ... }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MyHandlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

바인딩 식이 View에 λŒ€ν•œ 클릭 λ¦¬μŠ€ν„°λ₯Ό ν• λ‹Ή ν•  수 μžˆλ‹€. μ‹μ—μ„œ λ©”μ„œλ“œμ˜ μ„œλͺ…은 Listener 객체에 μžˆλŠ” λ©”μ„œλ“œμ˜ μ„œλͺ…κ³Ό μ •ν™•νžˆ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

3.1.2. λ¦¬μŠ€λ„ˆ 바인딩

λ¦¬μŠ€λ„ˆ 바인딩은 이벀트 λ°œμƒ μ‹œ μ‹€ν–‰λ˜λŠ” 바인딩 식이닀. λ©”μ„œλ“œ 참쑰와 λΉ„μŠ·ν•˜μ§€λ§Œ, λ¦¬μŠ€λ„ˆ 바인딩을 μ‚¬μš©ν•˜λ©΄ μž„μ˜μ˜ 데이터 바인딩 식을 μ‹€ν–‰ν•  수 μžˆλ‹€(Android Gradle Plugin for Gradle 버전 2.0 μ΄μƒμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯).

λ©”μ„œλ“œ μ°Έμ‘°μ—μ„œλŠ” λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜κ°€ 이벀트 λ¦¬μŠ€λ„ˆμ˜ λ§€κ°œλ³€μˆ˜μ™€ μΌμΉ˜ν•΄μ•Όν•œλ‹€. λ¦¬μŠ€λ„ˆ λ°”μΈλ”©μ—μ„œλŠ” λ°˜ν™˜ 값은 λ¦¬μŠ€λ„ˆμ˜ μ˜ˆμƒ λ°˜ν™˜ κ°’κ³Ό μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

public class Presenter {
    public void onSaveClick(Task task){}
}
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="task"
        type="com.android.example.Task" />
    <variable
        name="presenter"
        type="com.android.example.Presenter" />
</data>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="@{() -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>

λ‹€μŒκ³Ό 같이 click 이벀트λ₯Ό λ©”μ„œλ“œμ— 바인딩 ν•  수 μžˆλ‹€. λ¦¬μŠ€λ„ˆν‹‘ μ‹μ˜ 루트 μš”μ†Œλ‘œλ§Œ ν—ˆμš©λ˜λŠ” λžŒλ‹€ μ‹μœΌλ‘œ ν‘œν˜„λœλ‹€. ν‘œν˜„μ‹μ—μ„œ 콜백이 μ‚¬μš©λ  λ•Œ 데이터 바인딩이 ν•„μš”ν•œ λ¦¬μŠ€λ„ˆλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ΄λ²€νŠΈμ— λ“±λ‘ν•œλ‹€. λ·°κ°€ 이벀트λ₯Ό λ°œμƒμ‹œν‚€λ©΄ 데이터 바인딩이 주어진 식을 κ³„μ‚°ν•œλ‹€. μ •κ·œ 바인딩 μ‹μ—μ„œμ²˜λŸΌ, 이 λ¦¬μŠ€λ„ˆ 식이 ν‰κ°€λ˜λŠ” λ™μ•ˆ μ—¬μ „νžˆ 데이터 λ°”μΈλ”©μ˜ null 및 μŠ€λ ˆλ“œ μ•ˆμ „μ΄ 보μž₯λœλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ”Β onClick(android.view.View)둜 μ „λ‹¬λ˜λŠ”Β viewΒ λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜λ‹€. λ¦¬μŠ€λ„ˆ λ°”μΈλ”©μ—μ„œλŠ” λ¦¬μŠ€λ„ˆ λ§€κ°œλ³€μˆ˜λ‘œ 두 가지 μ€‘μ—μ„œ 선택할 수 μžˆλŠ”λ°, λ©”μ„œλ“œμ— λŒ€ν•œ λͺ¨λ“  λ§€κ°œλ³€μˆ˜λ₯Ό λ¬΄μ‹œν•˜κ±°λ‚˜ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ˜ 이름을 μ§€μ •ν•˜λŠ” 것이닀. λ§€κ°œλ³€μˆ˜μ˜ 이름을 μ§€μ •ν•˜κΈ°λ‘œ μ„ νƒν•˜λ©΄ 식에 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

  • ν‘œν˜„μ‹μ— λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  κ²½μš°μ—λŠ” μ•„λž˜μ™€ 같이 μ“Έ 수 μžˆλ‹€.
android:onClick="@{(view) -> presenter.onSaveClick(task)}"
  • 두 개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό ν¬ν•¨ν•œ λžŒλ‹€ 식을 μ‚¬μš©ν•  수 μžˆλ‹€.
public class Presenter {
    public void onSaveClick(View view, Task task){}
}
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"
  • μˆ˜μ‹  쀑인 μ΄λ²€νŠΈκ°€ void ν˜•μ‹μ΄ μ•„λ‹Œ 값을 λ°˜ν™˜ν•˜λŠ” 경우, 식도 그와 λ™μΌν•œ ν˜•μ‹μ˜ 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, LongClick 이벀트λ₯Ό μˆ˜μ‹ ν•˜λ €λŠ” κ²½μš°μ—λŠ” μ‹μ—μ„œ boolean을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
public class Presenter {
    public void onCompletedChanged(Task task, boolean completed){}
}
<CheckBox 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"
	android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

3.2. λ ˆμ΄μ•„μ›ƒ 세뢀정보

data μš”μ†Œ λ‚΄μ—μ„œλŠ” import μš”μ†Œκ°€ μ „ν˜€ μ‚¬μš©λ˜μ§€ μ•Šκ±°λ‚˜ ν•œ 개 이상 μ‚¬μš©λ  수 μžˆλ‹€. javaμ—μ„œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, μ΄λŸ¬ν•œ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒ 파일 내에 μžˆλŠ” 클래슀λ₯Ό μ‰½κ²Œ μ°Έμ‘°ν•  수 μžˆλ‹€.

<data>
    <import type="android.view.View"/>
</data>

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

클래슀 이름 간에 좩돌이 λ°œμƒν•  λ•Œ ν•΄λ‹Ή 클래슀 쀑 ν•˜λ‚˜μ˜ 이름을 λ‹€μŒκ³Ό 같이 λ°”κΏ€ 수 μžˆλ‹€.

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

더 λ§Žμ€ 정보듀은 μ•„λž˜ 클릭 ↓

https://developer.android.com/topic/libraries/data-binding/expressions

3.3. 데이터 객체(Observable)

데이터 바인딩에 μž„μ˜μ˜ POJOλ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, POJOλ₯Ό μˆ˜μ •ν•˜λ”λΌλ„ UIκ°€ μ—…λ°μ΄νŠΈ λ˜μ§€λŠ” μ•ŠλŠ”λ‹€. 데이터가 변경될 λ•Œ 이λ₯Ό μ•Œλ €μ£ΌλŠ” κΈ°λŠ₯을 데이터 객체에 λΆ€μ—¬ν•˜λ©΄ 데이터 λ°”μΈλ”©μ˜ μ§„μ •ν•œ 강점을 ν™œμš©ν•  수 μžˆλ‹€.

3.3.1. Observable 객체

android.databinding.ObservableΒ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 바인딩이 λ°”μΈλ”©λœ 객체에 단일 λ¦¬μŠ€λ„ˆλ₯Ό μ—°κ²°ν•˜μ—¬ κ·Έ 객체에 λŒ€ν•œ λͺ¨λ“  μ†μ„±μ˜ λ³€κ²½ 사항을 μˆ˜μ‹ ν•  수 μžˆλ‹€. 직접 κ°œλ°œν•  μˆ˜λ„ μžˆμ§€λ§Œ, Observable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ BaseObservable 클래슀λ₯Ό μ΄μš©ν•˜λ©΄ 더 μ‰½κ²Œ κ°œλ°œν•  수 μžˆλ‹€. getterμ—λŠ” @Bindable 주석을 ν• λ‹Ήν•˜κ³  setterμ—λŠ” nofityPropertyChanged(int fieldId) λ₯Ό 톡해 속성 변경을 μ•Œλ¦΄ 수 μžˆλ‹€.

private static class User extends BaseObservable {
   private String firstName;
   private String lastName;
    
   @Bindable
   public String getFirstName() {
       return this.firstName;
   }
   @Bindable
   public String getLastName() {
       return this.lastName;
   }
   public void setFirstName(String firstName) {
       this.firstName = firstName;
       notifyPropertyChanged(BR.firstName);
   }
   public void setLastName(String lastName) {
       this.lastName = lastName;
       notifyPropertyChanged(BR.lastName);
   }
}

@Bindable 주석은 컴파일 쀑에 BR 클래슀 νŒŒμΌμ— ν•­λͺ©μ„ μƒμ„±ν•œλ‹€. BR 클래슀 νŒŒμΌμ€ λͺ¨λ“ˆ νŒ¨ν‚€μ§€μ— μƒμ„±λœλ‹€.

3.3.2. ObservableField

android.databinding.Observable 클래슀λ₯Ό μƒμ„±ν•˜λ €λ©΄ μ•½κ°„μ˜ μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€. ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같은 속성이 있으면 더 μ‰½κ²Œ κ°œλ°œν•  수 μžˆλ‹€.

  • android.databinding.ObservableField 와 ν˜•μ œλ“€μΈ
  • android.databinding.ObservableBoolean
  • android.databinding.ObservableByte
  • android.databinding.ObservableChar
  • android.databinding.ObservableShort
  • android.databinding.ObservableInt
  • android.databinding.ObservableLong
  • android.databinding.ObservableFloat
  • android.databinding.ObservableDouble
  • android.databinding.ObservableParcelable을 μ‚¬μš©ν•  수 μžˆλ‹€.

ObservableFieldsλŠ” 단일 ν•„λ“œλ₯Ό 가진, 자체 포함 λ°©μ‹μ˜ Observable 객체이닀. μ›μ‹œ 버전은 μ•‘μ„ΈμŠ€ μž‘μ—… 쀑에 boxingκ³Ό unboxing을 λ°©μ§€ν•œλ‹€. λ”°λΌμ„œ 이λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 데이터 ν΄λž˜μŠ€μ— public final ν•„λ“œλ₯Ό μƒμ„±ν•΄μ•Όν•œλ‹€.

private static class User {
   public final ObservableField<String> firstName =
       new ObservableField<>();
   public final ObservableField<String> lastName =
       new ObservableField<>();
   public final ObservableInt age = new ObservableInt();
}

값에 μ—‘μ„ΈμŠ€ν•˜λ €λ©΄ set, get μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

user.firstName.set("Google");
int age = user.age.get();

3.3.3. Observable μ»¬λ ‰μ…˜

일뢀 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 데이터 μœ μ§€λ₯Ό μœ„ν•΄ λ”μš± 동적인 ꡬ쑰체λ₯Ό μ‚¬μš©ν•œλ‹€. Observable μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 데이터 객체에 ν‚€ μž…λ ₯ λ°©μ‹μœΌλ‘œ μ•‘μ„ΈμŠ€ν•  수 μžˆλ‹€.

  • ν‚€κ°€ Stringκ³Ό 같은 μ°Έμ‘° ν˜•μ‹μΌ λ•ŒλŠ” Β android.databinding.ObservableArrayMap이 μœ μš©ν•˜λ‹€.
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
  • λ ˆμ΄μ•„μ›ƒμ—μ„œ λ‹€μŒκ³Ό 같이 String ν‚€λ₯Ό 톡해 맡에 μ—‘μ„ΈμŠ€ ν•  μˆ˜λ„ μžˆλ‹€.
<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap&lt;String, Object&gt;"/>
</data>
…
<TextView
   android:text='@{user["lastName"]}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
<TextView
   android:text='@{String.valueOf(1 + (Integer)user["age"])}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
  • ν‚€κ°€ μ •μˆ˜μΌ λ•ŒλŠ” android.databinding.ObservableArrayListκ°€ μœ μš©ν•˜λ‹€.
ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);
  • λ ˆμ΄μ•„μ›ƒμ—μ„œλŠ” 인덱슀λ₯Ό 톡해 λ¦¬μŠ€νŠΈμ— μ—‘μ„ΈμŠ€ν•  수 μžˆλ‹€.
<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
</data>
…
<TextView
   android:text='@{user[Fields.LAST_NAME]}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
<TextView
   android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>