android - 使用 MVVM 重用组件的最佳实践
问题描述
我想知道是否有人在使用 MVVM 时找到了一些巧妙的解决方案来重用组件(多个视图)。
我所说的组件是指最终在应用程序中重用的一组视图。例如,由 anImageView
和 a组成的空状态,为了示例,我们还为文本TextView
添加某种类型。ClickListener
现在,我想做的是在多个 .xml 文件中重用此视图,但为文本、图像提供不同的值,并将侦听器绑定到 Fragment 中的操作ViewModel
。
我一直在做的是创建一个CustomEmptyState
可以扩展一个LinearLayout
或某种布局并添加Custom Attributes
到它的。
所以,最后,我会像这样使用我的自定义视图:
<com.whatever.customViews.CutomEmptyState
app:image="@drawable/someImage"
app:text="@string/empty_text"
app:onTextClicked="@{viewModel.onEmptyStateClicked()}" />
我的问题是,有不同的方法吗?一个更好的?我不喜欢用<declare-styleable>
and all 编写自定义属性,因为那时我必须跟踪 3 个文件:
- 基础视图的
.xml
布局 .java/.kt
具有处理属性的样板代码的视图- 具有
<declare-styleable>
所有属性的
有什么办法可以结合2和3吗?
解决方案
比如说,你必须显示一些你确定会被数据绑定的文本值。
然后,如果您对值进行数据绑定,那么有一种方法,但不是一种优雅的方法。
在自定义视图中声明一个变量,例如: private var status = ""
然后写一个setter函数:
fun setStatus(status: String) {
this.status = status
//refresh your views based on value or set this to the text view
}
然后像这样进行数据绑定:
app:status="@{viewModel.status}"
这样您就不需要再声明样式了
推荐阅读
- python - Python-Requests 验证参数如何工作?SSL 证书
- azure - 我应该为静态网站的 Azure Pipeline 的 rootDirectory 指定什么?
- ffmpeg - FFMPEG 程序来裁剪图像并并排合并它们
- groovy - JMETER - WebDriver 采样器 - Groovy - 动态名称
- google-bigquery - 将数据从 GCS 传输到 Bigquery 表失败
- html - 如何使用 BeautifulSoup获取文本
- sql-server - 具有多个参数的 SQL 函数
- python - 如何将具有多个 JSON 对象的 Asana API 响应转换为 Python 对象
- http - 我如何自己编写 HTTP POST 请求 multipart/form-data?
- visual-studio-code - 如何在具有 VIM 扩展的 VSCode 中将光标从其主体移动到 C++ 函数(方法)的名称