DataBinding
DataBinding是實現數據和UI雙向綁定的框架,可以用來構建MVVM的架構讓數據可以直接绑定到布局上,省去大部分的程式碼。
<layout>:使用DataBinding,必須要在佈局的最外層包layout標籤。
<data>:用來承載資料的,內部可以定義多個import標籤和variable標籤。
<variable>:用來把布局與程式碼綁定,每個variable標籤的name屬性值不可相同,但type屬性值可以相同。
name:用於定義資料來源的名稱。
type:用於定義資料來源所在路徑。
@{"操作行為"}:單向綁定。
@={"操作行為"}:雙向綁定,資料會兩邊相同,當EditText輸入文字時資料會即時傳回。
DataBindingUtil.setContentView:生成DataBinding,類別為layout名稱的大寫+Binding。
android {
buildFeatures {
dataBinding true
}
}
dependencies {
implementation "androidx.fragment:fragment-ktx:1.2.5"
}
對著ConstraintLayout(ViewGroup)按下Alt+Enter
<?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="viewModel"
type="com.example.myapplication.MyVM" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="220dp"
android:ems="10"
android:inputType="textPersonName"
android:text="@={viewModel.name}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:onClick="@{viewModel::change}"
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="196dp"
android:text="change"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
創建VM
class MyVM : ViewModel(){
var name = MutableLiveData<String>()
//改變textview文字
fun change(view: View) {
name.value = "hello"
}
}
View與VM綁定
class MainActivity : AppCompatActivity() {
private val myViewModel by viewModels<MyVM>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.viewModel = myViewModel
myViewModel.name.observe(this, Observer {
binding.textView.text = it
})
}
}