android - 如何编写通用 BindingAdapter 来设置 OnLongClickListener?
问题描述
在我的 Android 项目中,我使用以下内容BindingAdapter
来OnLongClickListener
连接视图及其相应的视图模型。
@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, viewModel: MyViewModel, text: CharSequence) {
view.setOnLongClickListener {
viewModel.onButton1LongClick(text)
true
}
}
...在 XML 布局中:
app:onLongClick="@{viewModel}"
app:onLongClickText="@{otherView.text}"
这是同一视图模型类中的第二个适配器:
@JvmStatic
@BindingAdapter("onLongClick")
fun setOnLongClickListener(view: View, viewModel: MyViewModel) {
view.setOnLongClickListener {
viewModel.onButton2LongClick()
true
}
}
...在 XML 布局中:
app:onLongClick="@{viewModel}"
我很想使可BindingAdapter
重用的,以便它可以连接到不同的视图。我想我可以从 XML 传递实际的方法引用。这是我不工作的草稿:
@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, onLongClick: (CharSequence) -> Unit, text: CharSequence) {
view.setOnLongClickListener {
onLongClick.invoke(text)
true
}
}
...在 XML 布局中:
app:onLongClick="@{(view) -> viewModel.onButton1LongClick(???)}"
app:onLongClickText="@{otherView.text}"
解决方案
视图模型:
class MyViewModel : ViewModel() {
private val TAG = "MyViewModel"
fun onButton1LongClick(text: CharSequence) : Unit {
Log.d(TAG, "onButton1LongClick: " + text)
}
val f1 : (CharSequence) -> Unit = {text -> onButton1LongClick(text)}
fun onButton2LongClick() {
Log.d(TAG, "onButton2LongClick")
}
val f2 : () -> Unit = {onButton2LongClick()}
}
绑定适配器:
@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, onLongClick: (CharSequence) -> Unit, text: String?) {
view.setOnLongClickListener {
onLongClick.invoke(text?:"")
true
}
}
@JvmStatic
@BindingAdapter("onLongClick")
fun setOnLongClickListener(view: View, onLongClick: () -> Unit) {
view.setOnLongClickListener {
onLongClick.invoke()
true
}
}
XML 布局:
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
onLongClick="@{viewModel.f1}"
onLongClickText='@{editText.text.toString()}'
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1" />
<Button
onLongClick="@{viewModel.f2}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2" />
推荐阅读
- ios - 使用 Codable 和 CodableFirebase 快速解析 Firebase 值时为零
- ios - 在 SwiftUI 中隐藏表单中的第一部分后的额外空间
- c - 如何通过 Windows 批处理文件将值传递给 scanf()
- javascript - 如何只触发一次鼠标滚轮滚动
- tcl - Tcl 同时秒表和计数器不工作
- report - Snakemake 报告:在报告中包含 html 报告
- amazon-web-services - OpenVPN 未解析 HTTP/s 请求 - 连接到授权 VPN 时无法访问 AWS 私有 API 网关的端点
- firebase - OAuth2 client_id 检索,而不是来自控制台
- php - Laravel 6 - 如何让用户明天和以后不能使用
- c# - 内存使用和操作图像