提问者:小点点

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


我正在尝试将我的Android项目切换到Kotlin。我有一个< code>EditText(一个< code>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,但这两种方法之间有什么区别,使编译器的行为不同?我唯一能想到的是,文本视图有一个 mHint 属性,但我认为情况可能并非如此。

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


共3个答案

匿名用户

当生成Java getter/setter对的合成属性时,Kotlin首先寻找一个getter。吸气剂足以用一种类型的吸气剂产生合成性质。另一方面,如果只有一个setter存在,则属性不会被创建。

当设置程序开始运行时,属性创建变得更加困难。原因是getter和setter可能具有不同的类型。此外,getter和/或setter可能在子类中被重写。

在你的例子中,文本视图类包含一个 getter 字符序列 getText() 和一个 setter void set文本(字符序列)。如果您有一个 TextView 类型的变量,您的代码将正常工作。但是你有一个类型为编辑文本的变量。并且编辑文本类包含一个被覆盖的 getter 可编辑 getText(),这意味着您可以获取编辑文本的可编辑并将可编辑设置为编辑文本。因此,Kotlin 合理地创建了一个可编辑类型的合成属性文本字符串类不可编辑,这就是不能将字符串实例分配给 EditText的文本属性的原因。

匿名用户

为了避免类型不匹配,可以使用可编辑类的工厂内部类。所以你现在可以这样做:

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

匿名用户

或者,您可以编写一个扩展:

fun String.toEditable(): Editable =  Editable.Factory.getInstance().newEditable(this)

然后,您可以这样使用它:

mEditText.text = myString.toEditable()