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进行绑定
数据可以被监听并根据需要自动同步更新
本示例中,TaskDetailFragment会很潇洒的将Task数据传递给Data Binding层:
该库还会考虑到数据的显示问题,只要在布局中定义一下即可: (taskdetail_frag.xml)
taskdetail_frag.xml文件中的CheckBox,当用户触摸它时,Presenter直接被调用:
Activity: 对象创建入口
Fragment: 与Android框架中的组件交互 (options menu, Snackbar, FAB, Adapter for list…)
Presenter: 接收用户动作并从数据仓库中检索数据。如果它进行数据加载的工作,则去调用一个动作处理类来完成 (TasksItemActionHandler)
ViewModel: 暴露数据给指定视图
有些功能没有用到 ViewModel (TaskDetail, AddEditTask) ,这时他们是直接使用Task模型的
这个示例并未严格遵循 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/相关文章推荐
- Google官方关于Android架构中MVP模式的示例
- [译]Google官方关于Android架构中MVP模式的示例
- google官方架构MVP解析与实战【从零开始搭建android框架系列(3)】
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- 转:Android官方MVP架构示例项目解析
- Google官方MVP+Dagger2架构详解【从零开始搭建android框架系列(6)】
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))
- Google 官方Android MVP架构实践
- Android官方MVP架构示例项目解析
- Android单元测试<中>(Android官方MVP架构示例项目解析)
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解读
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))