반응형

LiveData

설명

  • Activity, Fragment의 LifeCycle에 맞춰 데이터를 관리
  • observer 패턴으로 데이터 변경을 감지하고 그에 따른 처리를 할 수 있게 해준다.

코드

MainActivity
class MainActivity : AppCompatActivity() {
    // private var text = MutableLiveData<String>().apply { value = "Hello World" } // 값 초기화
    private var text = MutableLiveData<String>()
    private var count = 0

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

        button.setOnClickListener {
            text.value = "Hello World - ${count++}"
        }

        text.observe(this, Observer {
            // textView.text = text.value
            textView.text = it
        })
    }
}

참고

LiveData + DataBinding

설명

  • LiveData와 DataBinding을 함께 사용할 경우 LiveData 변경시 참고하는 모든 View에 변경 사항을 자동으로 반영할 수 있어 편리하다.

코드

res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="main"
            type="com.example.android_example.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{`input : ` + editText.text}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{`count : ` + main.count}" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{main::onClickIncreaseCount}"
            android:text="increase count" />
    </LinearLayout>
</layout>
MainActivity
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    var count = MutableLiveData<Int>().apply { value = 1 }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater).apply {
            setContentView(root)
            lifecycleOwner = this@MainActivity // LiveData 실시간 반영을 위한 설정
            main = this@MainActivity // xml에 선언한 main 변수에 바인딩
        }
    }

    fun onClickIncreaseCount(view: View) {
        count.value = count.value?.plus(1)
    }
}

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] Application  (0) 2021.02.09
[Android] ViewModel  (0) 2021.02.09
[Android] DataBinding  (0) 2021.02.09
[Android] kotlin-android-extensions  (0) 2021.02.09
[Android] SoundPool  (0) 2021.02.09

+ Recent posts