DataBinding-LiveData-ViewModel (simple)

푸른하늘·2022년 5월 12일
0
post-thumbnail

<이글을 보기전 주의사항>
1. Data Binding 만 사용하실 예정이라면 ViewBinding을 사용하시는게 좋다.
2. 엑조디아 카드 모으는것처럼 3개의 라이브러리를 같이 사용해야 시너지 효과가 난다.
3. jetpack compoe 사용하시는 분은 이 글을 지나가는게 좋다.

<바로 시작>

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">

    <data>
        <variable
            name="counter"
            type="com.example.databindingviewmodel.MainActivity" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/txt_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="48dp"
            android:textSize="24sp"
            android:text="0"
            app:layout_constraintBottom_toTopOf="@+id/btn_increase"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

        <Button
            android:id="@+id/btn_increase"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:onClick="@{() -> counter.increase()}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
        <Button
            android:id="@+id/btn_down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:onClick="@{() -> counter.down()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/btn_increase"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

xml 사진

<xml 관련 설명>

1."@{() -> counter.down()}" 이건 xml 사용하시면 많이 보일텐대 주로 ex) 버튼을 클릭시 ~ 실행한다 의미이다. (뒤에 자세히 설명) 레이아웃 결합식
2. dataBinding을 사용할때 layout으로 감싸주고 data 안에있는 name 과 type에는 name = "원하는이름 지정" , type="package activity 위치" 이다.

Main Acitivty

class MainActivity : AppCompatActivity() {

     lateinit var binding: ActivityMainBinding
     lateinit var viewModel : MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        binding.apply {
            lifecycleOwner = this@MainActivity
        }
        binding.counter = this
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        viewModel.currentValue.observe(this, Observer {
            binding.txtNumber.text = it.toString()
        })
    }
    fun increase(){
        viewModel.updateValue(ActionType.UP)
    }

    fun down(){
        viewModel.updateValue(ActionType.DOWN)
    }

}

acitivty 정리

1.DataBinding 사용하는 방법
2. LiveData의 Lifecycleowner가 현재 activity(Main)라는 것을 명시해줘야 합니다.
3. binding.counter 해서 xml 을 연결시켜준다
4. viewModel을 만들기위해 ViewModelProvider을 초기화해준다.
5. MainViewModel 에 있는 currentValue 를 Observe 하면서 값을 변경시켜 준다.
6. xml에서 생성한 함수의 내용을 선언한다.

MainViewModel

enum class ActionType{
    UP, DOWN
}

class MainViewModel : ViewModel() {
	// mutableLiveData -> 데이터 수정 가능
    // LiveData -> 값 변동 안됨
    private val _currentValue = MutableLiveData<Int>()
	
    // 변경되지 않는 데이터를 가져 올 때 이름을 _언더스코어 없이 설정
    // 공개적으로 가져오는 변수는 private이 아닌 퍼블릭으로 외부에서도 접근가능하도록 설정
    // 하지만 값을 직접 라이브데이터에 접근하지 않고 뷰모델을 통해 가져올 수 있도록 설정
    val currentValue: LiveData<Int>
        get() = _currentValue

    init {
        _currentValue.value = 0
    }

    fun updateValue( type : ActionType){
        when(type){
            ActionType.UP ->
                _currentValue.value = _currentValue.value?.plus(1)

            ActionType.DOWN ->
                _currentValue.value = _currentValue.value?.minus(1)
        }
    }
}

LiveData란?

뷰모델에 들어가는 살아있는 데이터 라이브데이터와 뷰모델은 세트로 들어간다.

LiveData는 관찰 가능한 데이터 홀더 클래스이며

라이브 뷰모델안에 라이브데이터를 넣어놓고 Observe, 관측하면서 정보가 변경되면 뷰모델에서UI Update를 처리합니다.

+) Backing Field와 Backing Properties

class C {
    private val _elementList = mutableListOf<Element>()

    val elementList: List<Element>
         get() = _elementList
}

get? set?

getter/setter에 기본적으로 생성되는 속성(property)이다. Kotlin에서는 Class내의 property에 값을 할당할때는 내부적으로 setter가, 값을 불러올때는 getter가 호출된다.

get(),set() 같은 함수가 내부적으로 호출되고, get, set 내에서는 field,를 통해 프로퍼티가 가지고 있는 값에 접근한다
이렇게 뒤에 숨어잇는 field라는 의미로 Backing Field

Observer 패턴을 활용하기 위함이다.

profile
Developer-Android-CK

0개의 댓글