# Table of Contents

# RxBinding

RxBinding (opens new window)은 안드로이드 UI 위젯을 위한 바인딩 라이브러리입니다.

보통 버튼을 클릭했을 때의 이벤트는 다음과 같이 처리합니다.

class MainActivity : AppCompatActivity() {

    private val button: Button by lazy { findViewById(R.id.activity_main_button) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            // 버튼을 클릭했을 때
        }
    }
}

RxBinding를 사용하면 다음과 같이 버튼을 클릭했을 때의 이벤트를 구독(Subscribe)할 수 있습니다.

class MainActivity : AppCompatActivity() {

    private val button: Button by lazy { findViewById(R.id.activity_main_button) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.clicks()
            .subscribe {
                // 버튼을 클릭했을 때
            }
    }
}

이처럼 RxBinding을 사용하면 위젯에 발생하는 이벤트를 Observable하게 처리할 수 있습니다.

# 의존성 추가

RxBinding을 사용하려면 다음 의존성을 추가해야합니다.

// 모듈 수준의 build.gradle

// Platform Binding
implementation "com.jakewharton.rxbinding3:rxbinding:3.1.0"

// AndroidX Binding
implementation 'com.jakewharton.rxbinding3:rxbinding-core:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-drawerlayout:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-leanback:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-recyclerview:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-slidingpanelayout:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-swiperefreshlayout:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-viewpager:3.1.0'
implementation 'com.jakewharton.rxbinding3:rxbinding-viewpager2:3.1.0'

// Google Material Component Binding
implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.1.0'

# 사용법

# Button 클릭

우선 위에서 살펴본 것 처럼 버튼이 클릭되었을 때의 이벤트를 감지할 수 있습니다.

class MainActivity : AppCompatActivity() {

    private val button: Button by lazy { findViewById(R.id.activity_main_button) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.clicks()
            .subscribe {
                // 버튼을 클릭했을 때
            }
    }
}

# TextEdit의 텍스트 변화

보통 EditText의 텍스트가 변하는 것을 탐지하려면 TextWatcher를 사용합니다.

private val editText: EditText by lazy { findViewById(R.id.activity_main_editText) }

// ...

editText.addTextChangedListener(object: TextWatcher {
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        // 텍스트가 변하기 전에 호출
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        // 텍스트가 변할 때 호출
    }

    override fun afterTextChanged(s: Editable?) {
        // 텍스트가 변한 후 호출
    }
})

RxBinding를 사용하면 다음과 같이 Observable스럽게 텍스트 변화를 탐지할 수 있습니다.

private val editText: EditText by lazy { findViewById(R.id.activity_main_editText) }

// ...

editText
    .textChanges()
    .subscribe {
        // 텍스트가 변할 때 호출
    }

# 마치며

RxBinding을 사용하면 ButtonEditText 외에도 다양한 안드로이드 UI 위젯 이벤트를 Observable스럽게 처리할 수 있습니다. 특히 RxBindingObservable클래스의 debounce(), throttle() 메소드와 함께 사용할 때 강력한 힘을 발휘합니다.