Android 数据绑定(bind) : can't find setter for attribute android:onClick

标签 android binding android-databinding 2-way-object-databinding

我收到这个错误:

Cannot find the setter for attribute 'android:onClick' with parameter type android.view.View.OnClickListener on android.widget.Button. file:/home/itstym/ApkProjects/Reminder/app/src/main/res/layout/activity_main.xml loc:54:27 - 54:61

activity.main.xml

<data class="ActivityMainBinding">
        <variable
            name="login"
            type="com.example.itstym.reminder.loginViewModel" />

        <variable
            name="handler"
            type="com.example.itstym.reminder.LoginHandler" />
    </data>

     <Button
    android:onClick="@{(v) -> handler.onLoginButtonClicked(v,login)}"
    android:id="@+id/submit_button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="16dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="24dp"
    android:text="Sign In"
    app:layout_constraintEnd_toEndOf="@+id/user_password"
    app:layout_constraintStart_toStartOf="@+id/user_password"
    app:layout_constraintTop_toBottomOf="@+id/user_password"/>

MainActivity.java

val handler= LoginHandler(this@MainActivity)

LoginHandler.kt

class LoginHandler(context:Context) {

    fun onLoginButtonClicked(view:View, userInfo: loginViewModel) {
        Log.i("Email is ", userInfo.userEmailAddress)
        Log.i("Password is ", userInfo.userPassword)
    }
}

如何为此处的按钮创 build 置器?我想我只是为 View 创建它,而不是为按钮 setter 创建它。

堆栈跟踪

at android.databinding.tool.processing.Scope.assertNoError(Scope.java:112)
    at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$200(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.runContributingProcs(JavacProcessingEnvironment.java:627)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1033)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1198)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1068)
    at org.jetbrains.kotlin.kapt3.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:73)

任何线索都会有所帮助!

最佳答案

你的xml应该是这样的

<data class="ActivityMainBinding">
    <variable
        name="login"
        type="com.example.itstym.reminder.loginViewModel" />

    <variable
        name="handler"
        type="com.example.itstym.reminder.MainActivity" />
</data>

     <Button
        android:onClick="@{(v) -> handler.onLoginButtonClicked(v, login)}"
        android:id="@+id/submit_button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:text="Sign In"
        app:layout_constraintEnd_toEndOf="@+id/user_password"
        app:layout_constraintStart_toStartOf="@+id/user_password"
        app:layout_constraintTop_toBottomOf="@+id/user_password"/>

您可以直接在您的MainActivity 中获取此onClick。无需创建单独的类。

MainActivity.java

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setHandler(this);      

然后在 MainActivity 中,您可以像这样访问此方法:

public void onLoginButtonClicked(View view, LoginViewModel model) {
   //Do something
}

关于Android 数据绑定(bind) : can't find setter for attribute android:onClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44903587/

相关文章:

binding - react native onPress 与参数绑定(bind)

java - 使用 JSON-B 将 UUID 序列化为 JSON 中的规范十六进制字符串

wpf - 如何绑定(bind)到静态值?

找不到 Android 绑定(bind)适配器

android - Two-way databinding(in xml), ObservableField, BaseObservable ,我应该使用哪一个来进行双向数据绑定(bind)?

安卓数据绑定(bind) : Is there a good way to show/hide an includes tag?

java - 在 android xml 的图形布局中正确显示 CustomViews

android - 如何让 ImageSpan 与 TextView 中的其余文本具有相同的高度

java - 传感器更改不会触发 onSensorChanged

android谷歌地图api key 获取?