AndroidAnnotations - ViewById 不能用于私有元素
AndroidAnnotations - ViewById cannot be used on a private element
Android注释版本:4.3.1
Android编译SDK版本:26
科特林版本: 1.1.3-2
我正在尝试使用 Kotlin 和 AndroidAnnotaions 构建应用程序。构建以
结束
Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details
在 androidannotations.log
中有很多错误,例如
00:10:43.908 [RMI TCP Connection(91)-127.0.0.1] ERROR o.a.i.p.ModelValidator:77 - org.androidannotations.annotations.ViewById cannot be used on a private element
这就是@ViewById
注释的用法
@ViewById
var description: TextView? = null
Pref 注释的变量也会发生同样的情况。
是否还有其他人面临同样的问题,或者只有我遇到?
尝试使用lateinit
:
@ViewById
lateinit var description: TextView
出现此错误的原因可能是支持字段的行为。它默认是不可见的,field
标识符只能在 属性 的访问器中使用。这就是为什么你有 @ViewById cannot be used on a private element
.
lateinit
之所以有效,是因为它改变了字段的可访问性。根据 Kotlin doc:
Late-Initialized properties are also exposed as fields. The visibility of the field will be the same as the visibility of lateinit property setter.
因此,@JvmField
是解决此问题的另一种方法。
@ViewById
@JvmField var helloTextView: TextView? = null
它还更改了字段的可见性,如文档所述:
If you need to expose a Kotlin property as a field in Java, you need to annotate it with the @JvmField annotation. The field will have the same visibility as the underlying property. You can annotate a property with @JvmField if it has a backing field, is not private, does not have open, override or const modifiers, and is not a delegated property.
您还可以参考此 example and Kotlin docs 关于 Android 使用注释处理的框架。
Android注释版本:4.3.1
Android编译SDK版本:26
科特林版本: 1.1.3-2
我正在尝试使用 Kotlin 和 AndroidAnnotaions 构建应用程序。构建以
结束Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details
在 androidannotations.log
中有很多错误,例如
00:10:43.908 [RMI TCP Connection(91)-127.0.0.1] ERROR o.a.i.p.ModelValidator:77 - org.androidannotations.annotations.ViewById cannot be used on a private element
这就是@ViewById
注释的用法
@ViewById
var description: TextView? = null
Pref 注释的变量也会发生同样的情况。
是否还有其他人面临同样的问题,或者只有我遇到?
尝试使用lateinit
:
@ViewById
lateinit var description: TextView
出现此错误的原因可能是支持字段的行为。它默认是不可见的,field
标识符只能在 属性 的访问器中使用。这就是为什么你有 @ViewById cannot be used on a private element
.
lateinit
之所以有效,是因为它改变了字段的可访问性。根据 Kotlin doc:
Late-Initialized properties are also exposed as fields. The visibility of the field will be the same as the visibility of lateinit property setter.
因此,@JvmField
是解决此问题的另一种方法。
@ViewById
@JvmField var helloTextView: TextView? = null
它还更改了字段的可见性,如文档所述:
If you need to expose a Kotlin property as a field in Java, you need to annotate it with the @JvmField annotation. The field will have the same visibility as the underlying property. You can annotate a property with @JvmField if it has a backing field, is not private, does not have open, override or const modifiers, and is not a delegated property.
您还可以参考此 example and Kotlin docs 关于 Android 使用注释处理的框架。