DataBinding与LiveData双向绑定,自动刷新XML
DataBinding与LiveData双向绑定
依赖库:
implementation androidx.core:core-ktx:1.3.2 implementation androidx.appcompat:appcompat:1.2.0 implementation com.google.android.material:material:1.3.0 implementation androidx.constraintlayout:constraintlayout:2.0.4 implementation androidx.databinding:databinding-runtime:4.1.3
MainActivity:
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import com.kedacom.test.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding lateinit var nViewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.lifecycleOwner = this //关键代码 binding.mainActivity = this nViewModel = ViewModelProvider( this, ViewModelProvider.NewInstanceFactory() ).get(MainViewModel::class.java) nViewModel.nameData.value = "Test111" binding.viewModel = nViewModel } fun onButtonClick() { nViewModel.nameData.value = "Test222" } }
MainViewModel:
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MainViewModel : ViewModel() { var nameData: MutableLiveData<String> = MutableLiveData() }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <data> <variable name="MainActivity" type="com.kedacom.test.MainActivity" /> <variable name="viewModel" type="com.kedacom.test.MainViewModel" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="200dp" android:layout_height="wrap_content" android:onClick="@{()->MainActivity.onButtonClick()}" android:text="@{viewModel.nameData}" /> </LinearLayout> </layout>