LiveData의 값을 다른값으로 변경하기

최대환·2023년 12월 11일
0

LiveData의 값을 다른값으로 변경하기

LiveData Transformations라고도 한다.
아래사진과 같이 숫자를 입력하면 그게 두번 더해진 값이나 두번 곱해진 값이 나오는 앱으로 알아보고자한다.

먼저 데이터바인딩을 해주고

build.gradle
buildFeatures {
    dataBinding true
}

라이브데이터를 이용한 뷰모델을 만든다.
setLiveDataValueEditText에 입력값을 받고 viewModel에 세팅해주는 함수이다.

MainViewModel.kt
class MainViewModel : ViewModel() {

    // Transformations

    private var _mutableCount = MutableLiveData(0)
    val liveCount : LiveData<Int>
        get() = _mutableCount


    fun setLiveDataValue(count : Int) {
        _mutableCount.value = count
    }

}

메인 액티비티에는 데이터바인딩, 뷰모델 적용시켜주고 it끼리의 산수를 통해 결과값을 보여준다.

MainActivity
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으로 감싼다.

activity_main.xml
<?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를 사용하는 이유도 반감되는거 같다.
그리고 연산된 값을 다른 뷰에서 사용을 하지도 못한다.

profile
나의 개발지식 output 공간

0개의 댓글