[안드로이드] ViewModel - MutableData

나고수·2021년 9월 9일
0

andriod

목록 보기
9/27
post-thumbnail
post-custom-banner

mutabledata를 가진 viewmodel 써보기 실습

참고-개발하는정대리

//ViewModelTutorialAcitivty.kt

class ViewModelTutorialAcitivty : AppCompatActivity(), View.OnClickListener {
    lateinit var myNumberViewModel: MyViewModel
    private lateinit var binding: ActivityViewModelTutorialAcitivtyBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityViewModelTutorialAcitivtyBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //뷰모델을 가지고온다
        myNumberViewModel = ViewModelProvider(this)[MyViewModel::class.java]

        //3. 뷰모델에 값이 변경될 때 할 행동
        myNumberViewModel.currentValue.observe(this, Observer {
            Log.d(MyViewModel.TAG, "currentValue라이브 데이터 값 변경 :$it")
            binding.numberTextview.text = it.toString()
        })

        //1. 버튼을 누른다
        binding.plusBtn.setOnClickListener(this)
        binding.minusBtn.setOnClickListener(this)

    }

    override fun onClick(view: View?) {
        val userInput = binding.numberInputEdittext.text.toString().toInt()

        //2. 뷰모델에 라이브데이터 값을 변경하는 메소드 실행
        when (view) {
            binding.plusBtn ->
                myNumberViewModel.updateValue(ActionType.PLUS, userInput)
            binding.minusBtn ->
                myNumberViewModel.updateValue(ActionType.MINUS, userInput)
        }
    }
}
//MyViewModel.kt

enum class ActionType {
    PLUS, MINUS
}

// 데이터의 변경
// 뷰모델은 데이터의 변경사항을 알려주는 라이브 데이터를 가지고 있다
class MyViewModel : ViewModel() {

    companion object {
        const val TAG: String = "로그"
    }

    //MutableLiveData
    //LiveData

    // 내부에서 설정하는 자료형은 private 뮤터블로 & 변수명 앞에 언더바
    // 변경가능하도록 설정
    private val _currentValue = MutableLiveData<Int>()

    //외부에서는 언더바없이 변수이름 설정 & mutable이 아닌 그냥 livedata로 값 변경 x & public
    //get할때 mutablelivedata를 반환하도록 설정
    val currentValue: LiveData<Int>
        get() = _currentValue


    //초기값 설정
    init {
        Log.d(TAG, "생성자호출")
        _currentValue.value = 0
    }

    // 뷰모델이 가지고 있는 값을 변경하는 메소드
    fun updateValue(actionType: ActionType, input: Int) {
        when (actionType) {
            ActionType.PLUS -> _currentValue.value = _currentValue.value?.plus(input)
            ActionType.MINUS -> _currentValue.value = _currentValue.value?.minus(input)

        }
    }


}
//ViewModelTutorialAcitivty.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingHorizontal="10dp"
    tools:context=".ViewModelTutorialAcitivty">

    <TextView
        android:id="@+id/number_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="30dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/number_input_edittext"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:inputType="number"
        app:layout_constraintEnd_toStartOf="@+id/plus_btn"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/number_textview" />

    <Button
        android:id="@+id/plus_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="10dp"
        android:text="더하기"
        app:layout_constraintEnd_toStartOf="@+id/minus_btn"
        app:layout_constraintStart_toEndOf="@+id/number_input_edittext"
        app:layout_constraintTop_toTopOf="@+id/number_input_edittext" />

    <Button
        android:id="@+id/minus_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="빼기"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/plus_btn"
        app:layout_constraintTop_toTopOf="@+id/number_input_edittext" />


</androidx.constraintlayout.widget.ConstraintLayout>
profile
되고싶다
post-custom-banner

0개의 댓글