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>

results matching ""

    No results matching ""