Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 在EditText Kotlin中设置文本_Android_Kotlin_Android Edittext - Fatal编程技术网

Android 在EditText Kotlin中设置文本

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

我试图在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。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"