티스토리 뷰
databinding을 사용하기 전에 먼저 build.gradle에 아래를 추가해줍니다.
android {
...
dataBinding {
enabled = true
}
}
간단한 databinding 설명
//User.kt
data class User(val name: String? = null, val age: String? = null, val number: String? = null)
값을 저장하는 data class인 User 클래스를 만들었습니다.
// MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
val user = User("ImLeaf", "18", null)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.main = this
}
}
MainActivity 입니다.
ActivityMainBinding을 상속받고 있는 binding이라는 변수에
DataBindingUtil.setContentView를 넣고 binding.main에 context를 넣었습니다.
ActivityMainBinding 같은 경우는 DataBinding이 알아서 MainActivity면 Main, LoginActivity면 Login으로 만들어 줍니다.
binding.main = this 같은 코드는 아래 xml을 보면 이해할 수 있습니다.
// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="main"
type="com.leaf.android_databinding_example.MainActivity" />
<import type="android.view.View"/>
</data>
<LinearLayout 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:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{main.user.name}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{main.user.age}" />
</LinearLayout>
</layout>
먼저 xml 코드입니다.
<layout>
...
</layout>
레이아웃으로 감싸면서 databinding을 할 수 있습니다.
<data>
<variable
name="main"
type="com.leaf.android_databinding_example.MainActivity" />
</data>
이름을 원하는 것으로 지정을 하고 type으로 databinding을 하고 싶은 class에 연결해주면 됩니다.
위에서 말했던 binding.main = this 코드에서 main이 바로 xml에서 지정한 name입니다.
위와 같이 간단하게 databinding을 할 수 있습니다.
databinding을 통해 view의 visibility 설정
null 값이 들어왔을때 view의 visibility를 gone으로 바꾸는 방법도 있습니다.
먼저 xml의 data 부분에 아래와 같이 import 코드를 추가해줍니다.
<data>
<variable
name="main"
type="com.leaf.android_databinding_example.MainActivity" />
<import type="android.view.View"/>
</data>
그리고 아래와 같이 앨비스 연산자를 사용하여 설정 할 수 있습니다.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{main.user.number == null ? View.GONE : View.VISIBLE }"
android:text="@{main.user.number}" />
databinding을 통해 클릭 이벤트 하기
// MainActivity.kt
fun hello() = Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT).show()
MainActivity에 위와 같은 함수를 추가했습니다.
<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:onClick="@{() -> main.hello()}"
/>
xml 코드에서 위와 같이 onClick을 선언해주고 "() -> main.hello()" 으로 사용할 수 있습니다.
예제 코드
https://github.com/Im-Tae/Blog_Example/tree/master/Android/Android_DataBinding_Example
'알려주는 이야기 > 안드로이드' 카테고리의 다른 글
안드로이드 구글 지도 사용하기 - 2 [공공 API 연동하기] (2) | 2020.06.06 |
---|---|
안드로이드 구글 지도 사용하기 - 1 [구글 지도 띄우기] (0) | 2020.06.06 |
안드로이드 STT, TTS 예제 (0) | 2020.05.02 |
안드로이드 SharedPreference에 Json값 저장 (0) | 2020.04.25 |
안드로이드 4대 컴포넌트 (0) | 2020.01.20 |