在EditText Kotlin中设置文本

我试图在EditText中设置文本,但它说:

Type mismatch.
Required: Editable
Found: String

我的代码如下:

String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name

不要说使用setText,因为我使用的是kotlin,而不是Java。

165671 次浏览

使用setText(String),因为EditText.text首先需要editable,而不是String

为什么?

很好的解释这个链接下的迈克尔给出。请访问这个链接了解更多细节

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

当setter开始发挥作用时,属性创建变得更加困难。原因是getter和setter可能有不同的类型。此外,getter和/或setter可以在子类中被重写。

使用setText(String),因为editText.text需要Editable,而不是String

看一下EditText的API:

void setText (CharSequence text, TextView.BufferType type)

Editable getText ()

链接:https://developer.android.com/reference/android/widget/EditText.html

尝试使用nametxt。职位:nametxt.post ({nametxt。setText(“文本”)})

遵循Java getter和setter约定的方法(名称以get开头的无参数方法和名称以set开头的单参数方法)在Kotlin中表示为属性。 但是,在为Java getter/setter对生成属性时,Kotlin首先查找getter。getter足以从getter的类型推断出属性的类型。另一方面,如果只有setter存在,则不会创建该属性(因为Kotlin此时不支持仅设置属性) 当setter开始发挥作用时,属性生成过程变得有点模糊。原因是getter和setter可能有不同的类型。此外,getter和/或setter可以在子类中被重写, 这正是android中的EditText。

在上面的例子中,Android TextView类包含一个getter

CharSequence getText()

和一个setter void

setText(CharSequence)

如果我有一个TextView类型的变量,我的代码会工作得很好。 但是我使用了EditText类,其中包含一个重写的getter

Editable getText()

这意味着您可以为EditText获取一个可编辑的,并将一个可编辑的设置为EditText。因此,Kotlin合理地创建了一个可编辑类型的合成属性文本。由于String类是不可编辑的,这就是为什么我不能将String实例分配给EditText类的文本属性。

在为Java getter和setter方法生成kotlin属性时,JetBrains似乎忘记了指定getter方法的主要作用。无论如何,我已经通过github向Jet brains kotlin网站提交了拉请求。

我在这篇文章中也详细介绍了上述问题Kotlin如何从Java getter和setter中生成属性(Jetbrains未记录)

如果你想从principle中使用getter .text,请使用:

nametxt.text = Editable.Factory.getInstance().newEditable(name)

这里有几个有效的答案,但如果你仍然想使用属性格式并让你的代码看起来干净,你可以写一个扩展:

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

然后你可以这样使用它:

mEditText.text = myString.toEditable()

或者你可以使用extension属性:

var EditText.value
get() = this.text.toString()
set(value) {
this.setText(value)
}

并使用.value=而不是.text=

setText(String),所以你必须setText你的字符串到editText,所以在你的情况下是:nametxt.setText(名字)

我在我的项目中也有同样的问题,我给你一个例子,展示了如何使用Kotlin在布局中检索和设置数据: 有一个按钮save_button和两个文本编辑字段edit_nameedit_password.

 //when cliquing on the button 'save_button'
save_button.setOnClickListener {
// geting the value from the two fields by using .text.toString()
val email =  edit_name.text.toString()
val password = edit_password.text.toString()
// showing the result on the systeme's log
Log.d("Main activity","your email is " + email )
Log.d("Main activity", "your password is $password" )
// Then shows these values into the text view palete using  .setText()
text_view.setText("$email " + "$password")
}

简单的解决方案

只要使用edittext.setText(yourdata)而不是edittext.text,因为EditText是可编辑的,edittext.text用于TextView

例如:

var name:String = "Muzammil"
edittext.setText(name)

这就是我的工作。

像这样使用:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))

TextView,但我相信这应该在kotlin方面修复,以方便开发人员!

(someEditText as TextView).text = "someTextValue"

或者有一些扩展:

val EditText.asTextView: TextView get() = this as TextView


var EditText.value: CharSequence?
get() = asTextView.text
set(value) {
asTextView.text = value
}

你可以这样写:

someEditText.asTextView.text = "someTextValue"

someEditText.value = "someTextValue"

但遗憾的是你只是不能 简单的someEditText.text = "someTextValue"

val editable = editable . factory . getinstance ().newEditable(savedString)

editText。Text =可编辑