数据绑定-不能从布局文件调用函数



我试图从我的数据绑定布局调用一个函数,但我总是收到一些错误。我试图使用我创建的MyUtilClass的函数设置我的textView上的文本。下面是我的代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.example.testapp.User"/>
<import type="com.example.testapp.MyUtilClass"/>
<variable
name="user"
type="User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{MyUtilClass.Companion.changeText(user.firstName)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MyUtilClass

class MyUtilClass {
companion object {
@JvmStatic
fun changeText(text: String): String {
return text
}
}
}

用户

data class User(
val firstName: String,
val lastName: String,
val age: Int,
val loggedIn: Boolean
)

MainActivity.java

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val myUser = User("John", "Doe", 25, true)
binding.user = myUser
}
}

错误:

C: 用户Stefan AndroidStudioProjects TestApp app 制造 kapt 来源生成调试 com TestApp DataBinderMapperImpl.java例子:9:错误:找不到符号导入com.example.testapp.databinding.ActivityMainBindingImpl;^符号:类ActivityMainBindingImpl位置:包com.example.testapp.databinding

无法在类中找到方法changeText(java.lang.String)com.example.testapp.MyUtilClass.Companion

将JvmStatic添加到MyUtilClass中的changeText()方法中会自动使其成为静态的。因此,您可以在布局文件中这样访问它:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.example.testapp.User"/>
<import type="com.example.testapp.MyUtilClass"/>
<variable
name="user"
type="User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{MyUtilClass.changeText(user.firstName)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

您可以查看此链接以了解更多信息:Kotlin DataBinding将静态函数传入布局xml

这是我所做的更改,它起作用了。我基本上删除了class关键字,并添加了object。

object MyUtilClass {
@JvmStatic
fun changeText(text: String): String {
return text
}
}

最新更新