Data Binding
app的build.gradle
1
2
3
4
5
6
| android {
//...
buildFeatures {
dataBinding = true
}
}
|
layout
layout有特殊要求,必須是layout開頭,然後把constraintlayout包到layout裡面。
1
2
3
4
5
6
7
8
9
10
11
| <?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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.DataBindActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
|
在<layout></layout>之間增加<data></data>,裡面有變數,型別是包裝類別java.lang.Integer,不是基本型別int。
1
2
3
4
5
6
7
8
9
| <data>
<variable
name="username"
type="java.lang.String" />
<variable
name="age"
type="java.lang.Integer" />
</data>
|
把TextView的android:text與data對映,使用@{data變數名}
1
| <TextView android:text="@{username}" />
|
若是Integer要轉成String
1
| <TextView android:text="@{String.valueOf(age)}"/>
|
完整xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| <?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="username"
type="java.lang.String" />
<variable
name="age"
type="java.lang.Integer" />
<variable
name="user"
type="com.example.coroutine.repository.User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.DataBindActivity">
<TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{username}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="name" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:text="@{String.valueOf(age)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_username"
tools:text="age" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
|
binding
Prerequisites:
先處理viewbinding,再把data的屬性username、age設值。
1
2
3
4
5
6
7
8
9
| class DataBindActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityDataBindBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.username = "Bill"
binding.age = 10
}
}
|
data binding 物件
User物件
1
| data class User (val username: String, val age:Int)
|
1
2
3
4
5
| <data>
<variable
name="user"
type="com.example.coroutine.repository.User" />
</data>
|
1
2
| <TextView android:text="@{user.username}" />
<TextView android:text="@{String.valueOf(user.age)}" />
|
1
2
3
4
5
6
7
| override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityDataBindBinding.inflate(layoutInflater)
setContentView(binding.root)
val user = User("Alice", 20)
binding.user = user
}
|
完整xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <?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="user"
type="com.example.coroutine.repository.User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.DataBindActivity">
<TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.username}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="name" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:text="@{String.valueOf(user.age)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_username"
tools:text="age" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
|