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

我正在尝试将我的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 = z是x.setY(z)的快捷方式,但显然这种印象是错误的. setText()被视为普通方法而不是setter,但这两种方法间的区别是什么使编译器的行为不同?我唯一能想到的是TextView有一个mHint属性,但我不认为可能是这种情况.

我不太明白的另一件事是,android.text.Editable来自哪里?没有相应的setText(可编辑)方法,也没有此类型的公共字段.

解决方法:

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

一个二传手进场时,属性创造变得更加困难.原因是吸气剂和定位器可能具有不同的类型.此外,可以在子类中重写getter和/或setter.

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...