当前位置: 首页 > 知识库问答 >
问题:

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

唐永春
2023-03-14

我正在尝试将我的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个答案

薛浩言
2023-03-14

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

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

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

mEditText.text = myString.toEditable()
龙洛城
2023-03-14

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

textview.text = Editable.Factory.getInstance().newEditable("your text")  
陈宏胜
2023-03-14

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

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

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

 类似资料:
  • 工作正常。 现在假设setter内部有一些复杂的功能,稍后Java类中的字段被更改为,而不是。不会出现编译错误,但Kotlin调用将更改的值,跳过setter中发生的其他事情,并且可能会被忽略,导致逻辑错误。因此,我想知道:使用Kotlin属性访问语法来设置java字段是否安全?

  • 我已经实现了RecycraView. ViewHolder子类如下: 现在,我正试图访问在它中声明的绑定属性,就像在回收站视图的子类中一样。适配器: 但编译器正在抱怨—— 以下是完整的实现: 如果我在这里错过了什么,有什么想法吗?请建议。

  • null 从我的类中调用这些代码的工作方式与我预期的一样。但是,我想在Kotlin子类之外调用其中的一个方法。 如果从不同的Kotlin类尝试,则会出现以下编译错误: 未解析得引用:completeWakefulIntent

  • Kotlin具有委托属性,这是一个非常好的特性。但我正在研究如何获取和设置这些值。假设我想得到委托的财产的价值。在get()方法中,如何访问该值? 这是我如何实施的一个例子: 我无法理解的主要问题是,我如何将值设置为委托类被分配到的实际属性。当我将“NEW”赋给属性< code>p时,如何将该值存储到变量< code>p中,或者使用get读取传递给< code>p的新值?我是不是错过了一些基本的东

  • 嗨,我是Java泛型的新手,我正在尝试访问泛型类中的属性。到目前为止,我已经找到了C#相关的答案,如果有人能指导我如何在java中做到这一点,那将是非常有帮助的。假设我有Class Car,它有整数型轮子和字符串型模型的属性。现在我有一个方法,比如