Databinding
添加依赖
在bulid.gradle中添加依赖
buildFeatures {
dataBinding true
viewBinding true
}
转换布局
将布局转换为data binding layout
alt + enter 选择 Convert to data binding layout
代码演示:
导入ViewModel相关依赖
const val LIVEDATA_KTX = "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
const val VIEWMODEL_KTX = "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
创建ViewModel类
这里用了一个属性和方法,用于演示
class LgViewModel : ViewModel() {
var name = MutableLiveData("张三")
fun changeData() {
name.postValue("李四")
}
}
在布局文件中添加变量:
注意:类名前需要有包名
<data>
<variable
name="viewModel"
type="com.wuliner.login.LgViewModel" />
</data>
添加ViewModel
class LgPhoneFragment : Fragment() {
private lateinit var binding: FragmentLgPhoneBinding
private val loginViewModel: LgViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLgPhoneBinding.inflate(inflater, container, false)
binding.viewModel = loginViewModel
binding.lifecycleOwner = this
binding.executePendingBindings()
return binding.root
}
}
注意:
-
这里通过
by activityViewModels()
创建ViewModel,这样同一个Activity上的Fragment就能共享同一个ViewModel -
将创建的viewModel赋给视图的viewModel后,还需要
binding.lifecycleOwner = this
,t同步生命周期,再通过binding.executePendingBindings()
绑定数据
在布局文件中添加按钮和textView用于测试
使用data中定义变量的格式:@{变量名}
这里将TextView的text设为viewModel.name
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="164dp"
android:text="@{viewModel.name}"
android:textColor="@color/white"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
运行后,textView
的text就会显示ViewModel的默认值“张三”
处理点击事件
绑定适配器
添加kapt (在module的build.gradle添加)
创建点击事件:
class ClickEvent {
@BindingAdapter("changeData")
fun changeData(view: View, viewModel: LgLoginViewModel) {
viewModel.changeData()
}
}
在上面的代码中创建了一个类,changeData
方法就是需要处理的点击事件,需要添加@BindingAdapter
注解
在xml布局文件中:声明刚才创建的类型的变量
<variable
name="events"
type="com.wuliner.login.ClickEvent" />
创建ClickEvent,赋给event
给控件添加点击事件
在android:onClick="@{(view)->events.changeData(view, viewModel)}"
中,view参数即当前的Button
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:text="Button"
android:onClick="@{(view)->events.changeData(view, viewModel)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
属性绑定:
双向绑定
绑定多个属性: