android - Kotlin 属性访问语法如何适用于 Java 类(即 EditText setText)?

标签 android android-edittext kotlin

我正在尝试将我的 Android 项目切换到 Kotlin。我有一个 EditText(TextView 的子类),我想以编程方式为其设置提示和文本。提示按预期工作。但是,对于文本,如果我尝试使用 Kotlin setter 语法进行操作,则会出现类型不匹配异常:

    val test = EditText(context)

    test.setHint("hint")    // Lint message: "Use property access syntax"
    test.hint = "hint"      // ok

    test.setText("text")    // ok (no lint message)
    test.text = "text"      // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected

如果我们查看声明,我们会发现继承自 TextView 的相同签名:

    public final void setHint(CharSequence hint)

    public final void setText(CharSequence text)

我的印象是 x.y = zx.setY(z) 的快捷方式,但显然这种印象是错误的。 setText() 被视为普通方法而不是setter,但是这两种方法有什么区别使编译器表现不同呢?我唯一能想到的是 TextView 有一个 mHint 属性,但我不认为可能是这种情况。

还有一点我不太明白的是,android.text.Editable 是从哪里来的?没有对应的setText(Editable)方法,也没有这种类型的公共(public)字段。

最佳答案

在为 Java getter/setter 对生成合成属性时,Kotlin 首先查找 getter。 getter 足以创建具有 getter 类型的合成属性。另一方面,如果只有 setter 存在,则不会创建该属性。

当 setter 出现时,属性创建变得更加困难。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或 setter 可以在子类中被覆盖。

在您的情况下,TextView 类包含一个 getter CharSequence getText() 和一个 setter void setText(CharSequence)。如果你有一个 TextView 类型的变量,你的代码就可以正常工作。但是你有一个 EditText 类型的变量。并且 EditText 类包含一个重写的 getter Editable getText(),这意味着您可以为 EditTextEditable code> 并将 Editable 设置为 EditText。因此,Kotlin 合理地创建了 Editable 类型的合成属性 textString 类不是 Editable,这就是为什么不能将 String 实例分配给 text 属性的原因code>EditText 类。

关于android - Kotlin 属性访问语法如何适用于 Java 类(即 EditText setText)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374075/

相关文章:

android - 为什么我的图像在使用 glide 库加载后会缩小

java - 使用 Arrays.copyOf 的 minSdkVersion 应该是什么; jackson 问题

java - 在 editText 中每次更改字符串时自动单击 saveButton

Android EditText 标题(标题)就像 Android 指南中的那样

android - 如何使用多个选定选项实现 AutoCompleteTextView?

Android AlarmManager.setExactAndAllowWhileIdle() 警报在工作一段时间后未触发

子模块中的 Android 数据绑定(bind)

reactjs - Ktor + React 项目配置

java - 如何检查 EditText 是否具有特定文本/字符串

安卓计费库