Android + Kotlin + DataBinding

이전에는Kotlin Android Extensions감동을쓰면친구에게DataBinding최근안드로이드 프로젝트에서일반적으로사용한다는 것을배웠으니써보자.

환경


Android Studio 3.1.2

데이터 바인딩이란 무엇입니까

ViewModel, 값을 변경하면 xml의 속성에 자동으로 액세스할 수 있습니다.ActivityView에 대한 방문을 낙서하지 않아 원활한 관리가 쉽다.반대로 속성이 변하면 ViewModel 의 값도 바꿀 수 있다.

간단한 샘플을 만들어 보도록 하겠습니다.


이번에는 ViewTextViewtextViewModelname를 연결시키고 싶습니다.MyAppA라는 이름으로 프로젝트를 했다면 build.gradle 중 두 곳을 추가한다.
app/build.gradle
apply plugin: 'kotlin-kapt' // ここを追記

android {
    ...
    // ここを追記
    dataBinding {
        enabled = true
    }
}

이어viewmodel 폴더를 만들고 MainViewModel 클래스를 만듭니다.
MainViewModel.kt
package com.funeasysoft.myappa.viewmodel

class MainViewModel {
    var name = "funeasy"
}
링크된 xml 파일을 편집합니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="com.funeasysoft.myappa.viewmodel.MainViewModel" />
    </data>

    <android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.name}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</layout>
원래 레이아웃을 <Layout> 로 둘러싸고, 추가<data> ViewModel 클래스를 지정합니다.한편 이번에는 TextViewtext와dataBinding을 진행하기 위해 android:text="@{viewModel.name}"로 설정했다.
여기에서 주의해야 할 것은 원래 ConstraintLayout에 첨부되어 있다xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"꺼야 돼.
삭제하지 않으면 다음과 같은 오류가 발생합니다.
error: duplicate attribute.
Message{kind=ERROR, text=error: duplicate attribute., sources=[/Users/masa/DevAndroid/MyAppA/app/src/main/res/layout/activity_main.xml:13], original message=, tool name=Optional.of(AAPT)}
마지막으로 관련Activity.
MainActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // setContentView(R.layout.activity_main) // コメントアウト

        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.viewModel = MainViewModel()
    }

실행 후 화면에 MainViewModel 클래스 namefuneasy 가 표시됩니다.

버튼 클릭 -> TextView 변경

buttonClicked().또한viewModel.이름을 ObservableField("[初期値]") 로 변경하여 표시를 변경합니다.
MainViewModel.kt
package com.funeasysoft.myappa.viewmodel

import android.databinding.ObservableField

class MainViewModel {
    var name = ObservableField("funeasy")

    fun buttonClicked() {
        name.set("Button clicked!")
    }
}
추가Button, 설정android:onClick="@{() -> viewModel.buttonClicked()}".
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">

    <data>
        <variable
            name="viewModel"
            type="com.funeasysoft.myappa.viewmodel.MainViewModel" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/textView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="@{viewModel.name}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="Button"
            android:onClick="@{() -> viewModel.buttonClicked()}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />

    </android.support.constraint.ConstraintLayout>
</layout>
버튼을 누르면 텍스트가 확실히 변경됩니다!

앞으로 나는 각양각색MainViewModel을 맞춤형으로 만들어서 얼마나 가벼워질지 보고 싶다.

좋은 웹페이지 즐겨찾기