반응형
DataBinding
설명
- xml에서 객체를 연결해서 사용하는 방식
- xml에서 객체의 데이터와 메소드를 참조할 수 있다
- findViewById를 호출하지 않아도 view를 참조하는 객체를 제공한다.
코드
build.gradleplugins {
...
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 |