全文阅读预计 10 分钟
这可能是你看过的最清晰明了的讲解
主题 👇
写在前面:日常开发中,对于
UI
的修改通常我们会使用findViewById
这个方法,现在我们的页面上有一个TextView
假如说如果有一个东西可以让你不用获取这个tv
就可以修改这个控件的text、textColor
等各种参数呢,然后它又是Google 官方推荐
使用的,然后你又不需要手动去写注解、各种绑定
等等,教程会会很短,很清晰,Now, Let’s start to learn it!
官方说明:数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
差不多读读得了,翠花上代码~
使用 👇
配置
在你的 build.gradle
文件中配置如下
apply plugin: 'kotlin-kapt'
android{
...
dataBinding {
enabled true
}
}
// 注意:
// 如果你不只有 app 一个 Module
// 那么请在其它的 Module 的 build.gradle 文件中都配置一下
编写 ViewModel
还不知道什么是 LiveData ?请进入此链接学习我对于 LiveData 的快速及通俗讲解。 全文阅读预计 15 分钟。
还不知道什么是 ViewModel ?请进入此链接学习我对于 ViewModel 的快速及通俗讲解。 全文阅读预计 10 分钟。
public class SevenViewModel extends ViewModel {
public MutableLiveData<String> nickname;
public MutableLiveData<Boolean> isShow;
public MutableLiveData<String> getNickname() {
if (nickname == null)
nickname = new MutableLiveData<>();
return nickname;
}
public void getUserInfo() {
// 模拟获取网络数据
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getNickname().setValue("嘿嘿");
// 如果使用 Java 作为开发语言,那么建议我们都像 nickname 那样写一个 getNickname() 方法
// 避免我们因为人为的疏忽而造成空指针异常,毕竟我们一般情况下都不会像下面 isShow 这样在每个
// 地方都进行初始化,当然你可以在声明变量的时候直接
// public MutableLiveData<Boolean> isShow = new MutableLiveData<>();
// 不过这都是根据你的情况,在这里也向你推荐学习一下 Kotlin 语言开发 Android,它的开发非常
// 快速,我们这个页面的代码如果使用 Kotlin 编写,大概只需要 10 行左右,不过会 Kotlin 的基
// 本都会 Java,所以这里方便都能看懂所以提供 Java 版本的讲解
isShow = new MutableLiveData<>();
isShow.setValue(false)
}
}, 2000);
}
}
编写 XML
<?xml version="1.0" encoding="utf-8"?>
<!-- 需要以 layout 为根标签 -->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<!-- 导入 View 包,因为第二个 TextView 用到了 View.VISIBLE 和 View.GONE -->
<import type="android.view.View" />
<!-- sevenViewModel 这个名字可以随便取 -->
<!-- type={你的 ViewModel 的路径} -->
<variable
name="sevenViewModel"
type="com.example.studyproject.SevenViewModel" />
</data>
<!-- 这里是你的界面的布局 -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 这里的 @{sevenViewModel.nickname} 对应 ViewModel 中的 nickname -->
<TextView
android:id="@+id/tv_nickname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@{sevenViewModel.nickname}" />
<!-- 这里的 @{sevenViewModel.isShow} 对应 ViewModel 中的 isShow -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:text="一段文字"
android:visibility="@{sevenViewModel.isShow ? View.VISIBLE : View.GONE}" />
</FrameLayout>
</layout>
编写 Activity
public class SevenActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 将 Activity 和 布局 绑定
ActivitySevenBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_seven);
// 得到 ViewModel
SevenViewModel viewModel = ViewModelProviders.of(this).get(SevenViewModel.class);
// 将 DataBinding 和 ViewModel 互绑
// BR 用的是你项目包名下的,会自动生成
// 如果你的没有生成,试试:
// clean Project 或 Rebuild Project
// 如果实在没有生成可以在代码报错的情况下直接运行试试都有可能
binding.setVariable(BR.sevenViewModel, viewModel);
// 给 binding 设置 owner(LiveData 中有讲)
binding.setLifecycleOwner(this);
// 获取用户信息,此方法中 setValue() 方法调用完毕后,你的界面就会更新了
viewModel.getUserInfo();
}
}
还不知道什么是 LifecycleOwner ?请进入此链接学习我对于 LiveData 的快速及通俗讲解。 全文阅读预计 15 分钟。
文末 👇
如此,你已经走入了 Data Binding 的大门,当然 Data Binding 真正能做到的比上面多的太多了,我将在今后的博客中进行讲解,敬请关注!
码字不易,还请动动小手左侧栏中点赞 👍,3Q