Android 在EditText Kotlin中设置文本
我试图在EditText中设置文本,但它显示:Android 在EditText Kotlin中设置文本,android,kotlin,android-edittext,Android,Kotlin,Android Edittext,我试图在EditText中设置文本,但它显示: Type mismatch. Required: Editable Found: String 我的代码如下: String name = "Paramjeet" val nametxt = findViewById (R.id.nametxt) as EditText nametxt.text = name 不要说使用setText,因为我使用的是kotlin,而不是Java。使用setText(String)作为EditText。tex
Type mismatch.
Required: Editable
Found: String
我的代码如下:
String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name
不要说使用setText
,因为我使用的是kotlin,而不是Java。使用setText(String)
作为EditText。text
首先需要可编辑的
,而不是字符串
为什么?
由Michael在下面给出。请访问此链接以了解更多详细信息
为Java getter/setter对生成合成属性时,Kotlin首先查找getter。吸气剂足以创建具有吸气剂类型的合成属性。另一方面,如果仅显示setter,则不会创建属性
当二传手进场时,属性创建变得更加困难。原因是getter和setter可能有不同的类型。此外,getter和/或setter可能在子类中被重写。使用
setText(String)
,因为editText。text
需要可编辑的,而不是字符串查看editText的API:
void setText(CharSequence text,TextView.BufferType类型)
可编辑的getText()
链接:尝试使用nametxt.post:nametxt.post({nametxt.setText(“您的文本”)})遵循getter和setter的Java约定的方法(名称以get开头的无参数方法和名称以set开头的单参数方法)在Kotlin中表示为属性。
但是,在为Java getter/setter对生成属性时,Kotlin首先查找getter。getter足以从getter的类型推断属性的类型。另一方面,如果仅存在setter,则不会创建属性(因为Kotlin此时不支持仅设置属性)
当setter起作用时,属性生成过程变得有点模糊。原因是getter和setter可能有不同的类型。此外,getter和/或setter可以在子类中被重写,
android中的EditText就是这样
在上面的例子中,Android TextView类包含一个getter
CharSequence getText()
和一个二传手
setText(CharSequence)
如果我有一个TextView类型的变量,我的代码就会工作得很好。
但我使用了EditText类,它包含一个重写的getter
Editable getText()
这意味着您可以为EditText获取可编辑文本,并将可编辑文本设置为EditText。因此,Kotlin合理地创建了可编辑类型的合成属性文本。由于String类是不可编辑的,所以我无法将String实例分配给EditText类的text属性
JetBrains似乎忘记了在为Java getter和setter方法生成kotlin属性时指定getter方法的主导作用。无论如何,我已经通过github向Jet brains kotlin网站提交了pull请求
我在这篇文章中也详细介绍了上述问题如果您想使用getter。text
从原则上讲,请使用:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
这里有几个可行的答案,但是如果您仍然希望使用属性格式并使代码看起来干净,您可以编写一个扩展:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
然后,您可以这样使用它:
mEditText.text = myString.toEditable()
也可以使用扩展属性:
var EditText.value
get() = this.text.toString()
set(value) {
this.setText(value)
}
使用.value=
而不是.text=
setText(String),因此您必须将字符串设置为editText,因此在您的示例中是:nametxt.setText(name)我在项目中遇到了同样的问题,我给您一个示例,演示如何使用Kotlin在布局中检索和设置数据:
有一个按钮save_按钮
和两个文本编辑字段edit_name
和edit_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(您的数据
)而不是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))
或者cast到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.text=“someTextValue”
旁白的可能重复:如果您使用Kotlin Android扩展(随Android Studio提供),您不需要findViewById。您应该能够调用nextText.setText(name)
,而无需任何查找或转换。这不是您声称的Kotlin代码@Singh@VladyslavMatviienko:是的,我们应该删除此线程,因为每个无法在kotlin EditText中设置文本的人都会立即想到搜索“kotlin property access syntax for java classes.”这是当我看到编译器错误时第一个在我脑海中出现的东西。nither EditText在setText()之后获得焦点也没有打开软输入键盘,但为什么?听起来很相似!!Kotlin希望避免java的属性使用语法!是的,setter方法被抛出了窗口!扩展方法比使用旧的java setText要好。最好对编辑文本进行扩展:fun EditText.setEditableText(text:String){this.text=Editable.Factory.getInstance().newEditable(text)}这为什么被否决?似乎和Kotlin中的其他任何东西一样完全合理。@SMBiggs可能有太多类似的答案,我只是猜测,因为这是我的答案,比nhaarman的答案稍微好一点。
someEditText.value = "someTextValue"