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

新手上路,请多包涵

我正在尝试将我的 Android 项目切换到 Kotlin。我有一个 EditTextTextView 的子类),我想为其设置提示和文本编程。提示按预期工作。但是,对于文本,如果我尝试使用 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字段。

原文由 SqueezyMo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 523
2 个回答

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

当二传手上场时,财产创造变得更加困难。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或setter 可以在子类中被覆盖。

在您的情况下, TextView 类包含一个 getter CharSequence getText() 和一个 setter void setText(CharSequence) 。如果您有一个类型为 TextView 的变量,您的代码就可以正常工作。但是您有一个类型为 EditText 的变量。 And the EditText class contains an overridden getter Editable getText() , which means that you can get an Editable for an EditText and set an EditableEditText 。因此,Kotlin 合理地创建了一个类型为 — 的合成属性 text Editable 。 The String class is not Editable , that’s why you cannot assign a String instance to the text property of the EditText 上课。

原文由 Michael 发布,翻译遵循 CC BY-SA 3.0 许可协议

为避免类型不匹配,您可以使用 Editable 类的 Factory 内部类。所以你现在可以这样做:

 textview.text = Editable.Factory.getInstance().newEditable("your text")

原文由 souleymane sidibé 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题