Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin属性访问语法如何用于Java类(即EditText-setText)?_Android_Android Edittext_Kotlin - Fatal编程技术网

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

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

我正试图将我的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。吸气剂足以创建具有吸气剂类型的合成属性。另一方面,如果仅显示setter,则不会创建属性

当二传手进场时,属性创建变得更加困难。原因是getter和setter可能有不同的类型。此外,getter和/或setter可以在子类中被重写


在您的例子中,
TextView
类包含一个getter
CharSequence getText()
和一个setter
void setText(CharSequence)
。如果您有一个
TextView
类型的变量,那么您的代码可以正常工作。但是您有一个类型为
EditText
的变量。而
EditText
类包含一个重写的getter
Editable getText()
,这意味着您可以为
EditText
获取一个
可编辑的
,并将
可编辑的
设置为
EditText
。因此,Kotlin合理地创建了一个类型为可编辑的合成属性。
String
类是不可编辑的,这就是为什么不能将
String
实例分配给
EditText
类的
text
属性。
android.text.Editable
来自。在我看来,Kotlin中的
obj.text=value
分辨率是两步过程

  • 编译器尝试查找一个
    text
    属性或Java方法
    getText
    ,从中推断属性类型
  • 对于推断的属性类型,编译器尝试查找相应的属性setter或Java方法
    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。