반응형

DataBinding

설명

  • xml에서 객체를 연결해서 사용하는 방식
  • xml에서 객체의 데이터와 메소드를 참조할 수 있다
  • findViewById를 호출하지 않아도 view를 참조하는 객체를 제공한다.

코드

build.gradle
plugins {
    ...
    id 'kotlin-kapt' // 추가
}

android {
    ...
    // 4.0 버전 미만일 경우
    dataBinding {
        enabled true
    }

    // 4.0 버전 이상일 경우
    buildFeatures {
        dataBinding true
    }
}
res/layout/activity_main.xml
  • name : xml 안에서 참조할 변수명을 지정한다.
  • type : xml 안에서 참조할 클래스를 지정한다.
  • 위에서 지정한 변수명을 @{} 구문 안에서 사용한다
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="main"
            type="com.example.android_example.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{main.text}" />

        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{main.onClick}"
            android:text="click" />

    </LinearLayout>
</layout>
MainActivity
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    var text = ""
    var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // activity_main.xml에 루트를 layout 태그로 감쌀 경우
        // ActivityMainBinding 클래스로 접근하여 바인딩 처리 가능 
        binding = ActivityMainBinding.inflate(layoutInflater).apply {
            setContentView(root)
            lifecycleOwner = this@MainActivity
            main = this@MainActivity
        }

        /*binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.main = this*/

        /*binding.button.setOnClickListener {
            binding.textView.text = "Hello World"
        }*/
    }

    fun onClick(view: View) {
        text = "count - ${count++}"
        binding.invalidateAll() // data 변경됐다고 연결된 view들에 알려주는 메소드
    }
}

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] ViewModel  (0) 2021.02.09
[Android] LiveData  (0) 2021.02.09
[Android] kotlin-android-extensions  (0) 2021.02.09
[Android] SoundPool  (0) 2021.02.09
[Android] MediaPlayer  (0) 2021.02.09

+ Recent posts