Kotlin 项目中忽略了 BindingAdapter 注解。我怎样才能改变这个代码工作?
BindingAdapter annotation is ignored in kotlin project. How can I change this code to work?
我正在使用 kotlin 开发一个 android 项目,在尝试向多个按钮添加 OnTouchListener
时,我遇到了 运行 问题:无法通过XML 并且我想保持我的支持代码干净。经过一些研究,我发现我可以通过使用带有 @BindingAdapter
注释的方法来添加 XML 支持:
@BindingAdapter("onTouch")
fun Button.setXMLTouchListener(listener : View.OnTouchListener)
{
this.setOnTouchListener(listener);
}
此方法:
class MainActivity : AppCompatActivity()
{
...
...
fun goLeft(v : View, event : MotionEvent) : Boolean
{
// my code
}
}
并在 XML 中:
<layout
...>
<data>
<variable name="main_activity" type="my.path.to.MainActivity" />
</data>
<androidx.constraintLayout.widget.ConstraintLayout
...>
<Button
...
app:onTouch="@{main_activity.goLeft}" />
...
</androidx.constraintLayout.widget.ConstraintLayout>
</layout>
并在 build.gradle 中启用了数据绑定:
apply plugin: 'kotlin.kapt'
和
android {
...
dataBinding {
enabled = true
}
}
这显然不起作用,这些是我尝试过的解决方案:
- 将@Bindingadapter 函数从伴生对象移到顶层,因此编译为静态
- 尝试 app:onTouch 内容为 "main_activity.goLeft"(在教程中看到)、"main_activity.goLeft()"(原始尝试)和 "main_activity::goLeft"(编译器建议作为第一个已弃用)
- 向点击事件添加日志记录以确保按钮完全接收事件
- 将注释的值更改为 "app:onTouch" 以绝对确保它在正确的 xml 命名空间中
- 将触摸侦听器功能移动到非 activity 的 class 并实现 View.OnTouchListener(并相应地重命名函数)
经过一番调试,我也发现绑定函数根本就没有运行。
可能是什么问题,我该如何解决?
首先像这样编写数据绑定适配器。
@BindingAdapter("app:onTouch")
fun setXMLTouchListener(btn : Button , listener : View.OnTouchListener)
{
btn.setOnTouchListener(listener)
}
那就把goLeft()
好玩的
val goLeftListener = View.OnTouchListener { v, event ->
Log.d("goLeftListener " , "it Worked !")
return@goLeftListener true
}
并且不要忘记在 onCreate fun
的绑定对象上设置 activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: mainActivityBinding =
DataBindingUtil.setContentView(this, R.layout.main_activity)
binding.main_activity = this
}
最后一步,在 xml 布局中写入 Button 的 onTouch 属性,如下所示
<Button
.
.
app:onTouch="@{main_activity.goLeftListener}"
.
/>
我正在使用 kotlin 开发一个 android 项目,在尝试向多个按钮添加 OnTouchListener
时,我遇到了 运行 问题:无法通过XML 并且我想保持我的支持代码干净。经过一些研究,我发现我可以通过使用带有 @BindingAdapter
注释的方法来添加 XML 支持:
@BindingAdapter("onTouch")
fun Button.setXMLTouchListener(listener : View.OnTouchListener)
{
this.setOnTouchListener(listener);
}
此方法:
class MainActivity : AppCompatActivity()
{
...
...
fun goLeft(v : View, event : MotionEvent) : Boolean
{
// my code
}
}
并在 XML 中:
<layout
...>
<data>
<variable name="main_activity" type="my.path.to.MainActivity" />
</data>
<androidx.constraintLayout.widget.ConstraintLayout
...>
<Button
...
app:onTouch="@{main_activity.goLeft}" />
...
</androidx.constraintLayout.widget.ConstraintLayout>
</layout>
并在 build.gradle 中启用了数据绑定:
apply plugin: 'kotlin.kapt'
和
android {
...
dataBinding {
enabled = true
}
}
这显然不起作用,这些是我尝试过的解决方案:
- 将@Bindingadapter 函数从伴生对象移到顶层,因此编译为静态
- 尝试 app:onTouch 内容为 "main_activity.goLeft"(在教程中看到)、"main_activity.goLeft()"(原始尝试)和 "main_activity::goLeft"(编译器建议作为第一个已弃用)
- 向点击事件添加日志记录以确保按钮完全接收事件
- 将注释的值更改为 "app:onTouch" 以绝对确保它在正确的 xml 命名空间中
- 将触摸侦听器功能移动到非 activity 的 class 并实现 View.OnTouchListener(并相应地重命名函数)
经过一番调试,我也发现绑定函数根本就没有运行。
可能是什么问题,我该如何解决?
首先像这样编写数据绑定适配器。
@BindingAdapter("app:onTouch")
fun setXMLTouchListener(btn : Button , listener : View.OnTouchListener)
{
btn.setOnTouchListener(listener)
}
那就把goLeft()
好玩的
val goLeftListener = View.OnTouchListener { v, event ->
Log.d("goLeftListener " , "it Worked !")
return@goLeftListener true
}
并且不要忘记在 onCreate fun
的绑定对象上设置 activityoverride fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: mainActivityBinding =
DataBindingUtil.setContentView(this, R.layout.main_activity)
binding.main_activity = this
}
最后一步,在 xml 布局中写入 Button 的 onTouch 属性,如下所示
<Button
.
.
app:onTouch="@{main_activity.goLeftListener}"
.
/>