您的位置:首页 > 运维架构 > 网站架构

Google官方关于Android架构中MVP模式的示例续-DataBinding

2016-11-28 12:28 549 查看
基于前面的TODO示例,使用Data Binding库来显示数据并绑定UI元素的响应动作。

这个示例并未严格遵循 Model-View-ViewModel 或 Model-View-Presenter 模式,其中既有View Model,也有Presenter。

用到的Data Binding库保存样板代码,该代码允许将UI元素绑定到Data Model的一个属性。

布局文件中直接绑定数据到UI元素上

事件也与动作Handler进行绑定

数据可以被监听并根据需要自动同步更新



数据绑定

在上个例子中,Task描述在TaskDetailFragment中被设置:

public void onCreateView(...) {
...
mDetailDescription = (TextView)
root.findViewById(R.id.task_detail_description);
}

@Override
public void showDescription(String description) {
mDetailDescription.setVisibility(View.VISIBLE);
mDetailDescription.setText(description);
}

本示例中,TaskDetailFragment会很潇洒的将Task数据传递给Data Binding层:

@Override
public void showTask(Task task) {
mViewDataBinding.setTask(task);
}

该库还会考虑到数据的显示问题,只要在布局中定义一下即可: (taskdetail_frag.xml)

<TextView
android:id="@+id/task_detail_description"
...
android:text="@{task.description}" />

事件绑定

数据绑定消除了findViewById(),而事件绑定则用于最小化 setOnClickListener().

taskdetail_frag.xml文件中的CheckBox,当用户触摸它时,Presenter直接被调用:

<CheckBox
android:id="@+id/task_detail_complete"
...
android:checked="@{task.completed}"
android:onCheckedChanged="@{(cb, isChecked) ->
presenter.completeChanged(task, isChecked)}" />

监听数据(Observing data)

显示任务列表的视图层(TasksFragment)只需知道列表数据为空,以便显示恰当的提示消息。它用到TasksViewModel来给布局提供该信息。当列表大小被赋值时,只有相关属性会被通知且绑定到这些属性的UI元素会被更新。

public void setTaskListSize(int taskListSize) {
mTaskListSize = taskListSize;
notifyPropertyChanged(BR.noTaskIconRes);
notifyPropertyChanged(BR.noTasksLabel);
notifyPropertyChanged(BR.currentFilteringLabel);
notifyPropertyChanged(BR.notEmpty);
notifyPropertyChanged(BR.tasksAddViewVisible);
}

功能组件

用DataBinding库可以有多种方式来创建相关。本示例中,每个组件的职责为:

Activity: 对象创建入口

Fragment: 与Android框架中的组件交互 (options menu, Snackbar, FAB, Adapter for list…)

Presenter: 接收用户动作并从数据仓库中检索数据。如果它进行数据加载的工作,则去调用一个动作处理类来完成 (TasksItemActionHandler)

ViewModel: 暴露数据给指定视图

有些功能没有用到 ViewModel (TaskDetail, AddEditTask) ,这时他们是直接使用Task模型的

依赖

Data Binding 库.

特征(译:废话就不再翻译了)

可测试性

单元测试

UI测试

代码量

可维护性

增添特性容易

学习成本

https://github.com/googlesamples/android-architecture/tree/todo-databinding/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: