如何编写通用的 BindingAdapter 来设置 OnLongClickListener?
How to write a generic BindingAdapter to setup an 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}"
这是同一视图模型中的第二个适配器 class:
@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}"
ViewModel:
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" />
在我的 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}"
这是同一视图模型中的第二个适配器 class:
@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}"
ViewModel:
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" />