Squ*_*yMo 24 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
Run Code Online (Sandbox Code Playgroud)
如果我们查看声明,我们会发现从TextView以下内容继承的相同签名:
public final void setHint(CharSequence hint)
public final void setText(CharSequence text)
Run Code Online (Sandbox Code Playgroud)
我的印象x.y = z是一种捷径,x.setY(z)但显然这种印象是错误的.setText()被视为普通方法而不是setter,但这两种方法之间的区别是什么使编译器的行为不同?我唯一能想到的是,TextView有一个mHint属性,但我不认为它可能是这样.
我不太明白的另一件事是,android.text.Editable来自哪里?没有相应的setText(Editable)方法,也没有这种类型的公共领域.
谢谢.
Mic*_*ael 48
当为Java getter/setter对生成合成属性时,Kotlin首先寻找一个getter.getter足以创建一个具有getter类型的合成属性.另一方面,如果只有一个setter出现,则不会创建该属性.
当一个二传手进场时,属性创造变得更加困难.原因是吸气剂和定位器可能具有不同的类型.此外,可以在子类中重写getter和/或setter.
在您的情况下,TextView该类包含一个getter CharSequence getText()和一个setter void setText(CharSequence).如果你有一个类型的变量,TextView你的代码将正常工作.但是你有一个类型的变量EditText.并且EditText该类包含一个重写的getter Editable getText(),这意味着你可以得到一个Editablefor EditText并设置Editable为EditText.因此,Kotlin合理地创造了text类型的合成属性Editable.该String班是不是Editable,这就是为什么你不能在指定String实例的text的财产EditText类.
小智 12
要避免类型不匹配,可以使用可编辑类的Factory内部类.所以你现在可以这样做:
textview.text = Editable.Factory.getInstance().newEditable("your text")
Run Code Online (Sandbox Code Playgroud)
或者,您可以编写扩展名:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Run Code Online (Sandbox Code Playgroud)
然后可以按以下方式使用它:
mEditText.text = myString.toEditable()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14308 次 |
| 最近记录: |