Demo

将数据绑定到View
按下按钮 标签数字++
代码
MyViewModel.java
package com.example.databinding;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> number;
public MutableLiveData<Integer> getNumber() {
if (number == null) {
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}
public void add() {
number.setValue(number.getValue() + 1);
}
}
MainActivity.java
未使用DataBinding之前
每一次要将界面的控件要用变量连接
需要定义变量和关联绑定findViewById()
,控件如果多起来写起来比较麻烦 而且有隐患。
比如删除了某个控件,界面发生改变 就需改很多地方

使用DataBinding需要的操作
layout文件转换为databinding形式
1.在gradle android defaultConfig写入
dataBinding{
enabled true
}
如果报错出现:
Caused by: org.gradle.internal.resolve.ArtifactResolveException: Could not determine artifacts for androidx.lifecycle:lifecycle-runtime:2.1.0: No cached version available for offline mode
在dependencies中写入以下内容即可
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
2.在activity_main代码界面
点击 Convert to data Binding layout

在data
标签中写入
<variable
name="data"
type="com.example.databinding.MyViewModel" />
将对象进行反向绑定(回绑定到界面上)
例如:
<TextView>
android:id="@+id/textView"
android:text="@{String.valueOf(data.number)}"
/>
<Button
android:id="@+id/button"
android:onClick="@{()->data.add()}"
/>
在使用DataBinding,运行时出现错误
,检查发现DataBinderMapperImpl.java和BR.java都能自动生成,但报错找不到databBindingImpl类
import com.example.databinding.databinding.ActivityMainBindingImpl;
则需要重点检查databinding的界面语法,比如
比如我在android:onClick="@{()->data.add()}"
中少写了方法后面的()
3.在MainAcitvity中就 有一个layout文件名字的类型,创建其变量即可
ActivityMainBinding binding;
所以使用 使用DataBinding之后 界面代码变得的解耦,简洁明快
package com.example.databinding;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import com.example.databinding.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
MyViewModel myViewModel;//管理数据
ActivityMainBinding binding;//管理对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);//创建这个对象的绑定 xml的标签都会成为这个类的成员
//可以直接 通过 binding.textView来访问TextView
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
binding.setData(myViewModel);//数据反向绑定 设置数据
binding.setLifecycleOwner(this);//实现liveData的自我监听
}
}
activity_main.xml
<?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="data"
type="com.example.databinding.MyViewModel" />
</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"
android:text="@{String.valueOf(data.number)}"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.372" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="@{()->data.add()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.522" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
本文地址:https://www.dxoca.cn/StudyNotes/329.html 百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。