Android Kotlin属性访问语法如何用于Java类(即EditText-setText)?
我正试图将我的Android项目切换到Kotlin。我有一个Android Kotlin属性访问语法如何用于Java类(即EditText-setText)?,android,android-edittext,kotlin,Android,Android Edittext,Kotlin,我正试图将我的Android项目切换到Kotlin。我有一个EditText(一个TextView的子类),我想用编程的方式为它设置一个提示和文本。提示按预期工作。但是,对于文本,如果我尝试使用Kotlin setter语法执行此操作,则会出现类型不匹配异常: val test = EditText(context) test.setHint("hint") // Lint message: "Use property access syntax" test.hi
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。吸气剂足以创建具有吸气剂类型的合成属性。另一方面,如果仅显示setter,则不会创建属性
当二传手进场时,属性创建变得更加困难。原因是getter和setter可能有不同的类型。此外,getter和/或setter可以在子类中被重写
在您的例子中,
TextView
类包含一个getterCharSequence getText()
和一个settervoid setText(CharSequence)
。如果您有一个TextView
类型的变量,那么您的代码可以正常工作。但是您有一个类型为EditText
的变量。而EditText
类包含一个重写的getterEditable getText()
,这意味着您可以为EditText
获取一个可编辑的
,并将可编辑的
设置为EditText
。因此,Kotlin合理地创建了一个类型为可编辑的合成属性。String
类是不可编辑的,这就是为什么不能将String
实例分配给EditText
类的text
属性。android.text.Editable
来自。在我看来,Kotlin中的obj.text=value
分辨率是两步过程
text
属性或Java方法getText
,从中推断属性类型setText(PropertyType值)
从1号开始。推断的类型是可编辑的。
editText.text=“value”
失败,出现类型不匹配错误。为避免类型不匹配,可以使用可编辑类的工厂内部类。
因此,您现在可以执行以下操作:
textview.text = Editable.Factory.getInstance().newEditable("your text")
或者,您可以编写一个扩展:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
然后,您可以这样使用它:
mEditText.text = myString.toEditable()
很好的解释,先生。当从Kotlin打电话给java时,我想说linter并没有真正帮你一个忙,建议你使用合成属性。1) 当您可以使用它时,这一点并不明显(如OP的示例所示)2)因为有时您可以使用,有时您不能使用,您最终会使用两种不同的编码样式来执行类似的操作3)文档采用Java表示法。我只是关闭了检查。那么我如何从接口回调中获取文本呢。我想将对话框所选文本设置为edittext。