LiveData Transformations라고도 한다.
아래사진과 같이 숫자를 입력하면 그게 두번 더해진 값이나 두번 곱해진 값이 나오는 앱으로 알아보고자한다.
먼저 데이터바인딩을 해주고
buildFeatures {
dataBinding true
}
라이브데이터를 이용한 뷰모델을 만든다.
setLiveDataValue
는 EditText
에 입력값을 받고 viewModel에 세팅해주는 함수이다.
class MainViewModel : ViewModel() {
// Transformations
private var _mutableCount = MutableLiveData(0)
val liveCount : LiveData<Int>
get() = _mutableCount
fun setLiveDataValue(count : Int) {
_mutableCount.value = count
}
}
메인 액티비티에는 데이터바인딩, 뷰모델 적용시켜주고 it끼리의 산수를 통해 결과값을 보여준다.
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.btnArea.setOnClickListener {
val count = binding.inputArea.text.toString().toInt()
viewModel.setLiveDataValue(count)
}
viewModel.liveCount.observe(this, Observer {
binding.resultArea1.text = (it + it).toString()
binding.resultArea2.text = (it * it).toString()
})
}
}
데이터 바인딩이기때문에 레이아웃파일의 코드를 layout으로 감싼다.
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 10 -> 10 + 10 -->
<!-- 10 -> 10 x 10 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/inputArea"
android:hint="0"
android:textSize="50sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnArea"
android:text="btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/resultArea1"
android:text="0"
android:textSize="50sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/resultArea2"
android:text="0"
android:textSize="50sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
하지만 이런식으로 구현하면 MainActivity에서 값을 직접 변경하기 때문에 나중에 유지보수하기 어렵고, liveData를 사용하는 이유도 반감되는거 같다.
그리고 연산된 값을 다른 뷰에서 사용을 하지도 못한다.