在EditText Kotlin中设置文本


147

我正在尝试在EditText中设置文本,但是它说:

Type mismatch. 
Required: Editable 
Found: String

我的代码如下:

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

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



另外:如果您使用Kotlin Android扩展(与Android Studio一起提供),则不需要findViewById。您应该能够进行呼叫nexttxt.setText(name)而无需任何查找或强制转换。
AjahnCharles

这不是Kotlin代码,因为您声称@Singh
Sazzad Hissain Khan

Answers:


310

使用setText(String),因为editText.text期望一个Editable,而不是一个String


在setText()或softInput键盘打开后,其他EditText会获得焦点
Saurabh Bhandari

但为什么?听起来很相似!
Malwinder Singh

36

使用setText(String)EditText.text需要editable在firstplace不串

为什么呢?

尼斯解释迈克尔下给出这个链接。请访问此链接以获取更多详细信息

当为Java getter / setter对生成综合属性时,Kotlin首先会寻找getter。该吸气剂足以创建具有该吸气剂类型的合成属性。另一方面,如果仅显示设置器,则不会创建该属性。

当二传手开始发挥作用时,财产创造就变得更加困难。原因是getter和setter的类型可能不同。此外,可以在子类中重写获取器和/或设置器。


22

这里有几个可行的答案,但是如果您仍然想使用属性格式并使代码看起来干净,则可以编写扩展名:

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

然后可以按以下方式使用它:

mEditText.text = myString.toEditable()

1
扩展方法比使用旧的Java setText更好。
Piotr Badura


3

或者,您可以使用扩展属性:

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

并使用.value=代替.text=


2

遵循getter和setter的Java约定的方法(名称以get开头的无参数方法和名称以set开头的单参数方法)在Kotlin中表示为属性。但是,在为Java getter / setter对生成属性时,Kotlin首先会寻找getter。吸气剂足以从吸气剂的类型推断出属性的类型。另一方面,如果仅存在setter,则不会创建该属性(因为Kotlin目前不支持set-only属性)。

当二传手开始发挥作用时,属性生成过程会变得有些模棱两可。原因是getter和setter的类型可能不同。此外,getter和/或setter可能会在子类中被覆盖,这正是android中EditText的情况。

在上述情况下,Android TextView类包含一个吸气剂

CharSequence getText() 

和二传手无效

setText(CharSequence)

如果我有一个TextView类型的变量,我的代码会正常工作。但是我使用了EditText类,其中包含一个覆盖的getter

Editable getText()

这意味着您可以获得EditText的Editable并将Editable设置为EditText。因此,Kotlin合理地创建了Editable类型的合成属性文本。由于String类不可编辑,因此无法将String实例分配给EditText类的text属性。

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

我也在此中等职位中详细介绍了上述问题,Kotlin如何从Java Getters和Setters生成属性(Jetbrains未记录)


0

在我的项目中也遇到了同样的问题,我举一个例子,说明如何使用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")
                }

0

简单的解决方案

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

例如:

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

这就是我的工作。


0

像这样使用:

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


-2

还是TextView,但我相信这应该是固定在科特林侧面肯定了开发商的便利!

(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"



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.