Establecer texto en EditText Kotlin


148

Estoy tratando de configurar el texto en un EditText pero dice:

Type mismatch. 
Required: Editable 
Found: String

Mi código es el siguiente:

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

No diga usar setTextporque estoy usando kotlin, no Java.



Aparte: no necesita findViewById si usa las extensiones de Android Kotlin (incluidas con Android Studio). Deberías poder llamar nexttxt.setText(name)sin ningún hallazgo o casting.
AjahnCharles

Este no es un código de Kotlin, ya que reclama @Singh
Sazzad Hissain Khan

Respuestas:


310

Uso setText(String), ya que editText.textespera un Editable, no un String.


Ni EditText se enfoca después de setText () ni el teclado softInput abierto
Saurabh Bhandari

¿Pero por qué? ¡Suena muy similar!
Malwinder Singh

36

Use setText(String)como se EditText.textrequiere editableen primer lugar, no String

POR QUÉ ?

Buena explicación de Michael dada bajo este enlace . Visite este enlace para más detalles.

Al generar una propiedad sintética para un par getter / setter de Java, Kotlin primero busca un getter. El captador es suficiente para crear una propiedad sintética con un tipo de captador. Por otro lado, la propiedad no se creará si solo se presenta un setter.

Cuando un setter entra en juego, la creación de propiedades se vuelve más difícil. La razón es que el getter y el setter pueden tener un tipo diferente. Además, el getter y / o el setter pueden ser anulados en una subclase.


22

Aquí hay varias respuestas que funcionan, pero si aún desea utilizar el formato de propiedad y hacer que su código se vea limpio, puede escribir una extensión:

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

Luego puede usarlo como tal:

mEditText.text = myString.toEditable()

1
El enfoque de extensión es mejor que usar el antiguo setText de Java.
Piotr Badura

18

Si desea utilizar getter .textdesde el principio, use:

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

3

O puede usar una propiedad de extensión:

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

y usar en .value=lugar de.text=


2

Los métodos que siguen las convenciones de Java para getters y setters (métodos sin argumento con nombres que comienzan con get y métodos de argumento único con nombres que comienzan con set) se representan como propiedades en Kotlin. Pero, al generar una propiedad para un par getter / setter de Java, Kotlin al principio busca un getter. El captador es suficiente para inferir el tipo de propiedad del tipo del captador. Por otro lado, la propiedad no se creará si solo está presente un setter (porque Kotlin no admite propiedades de solo set en este momento).

Cuando un setter entra en juego, el proceso de generación de propiedades se vuelve un poco ambiguo. La razón es que el getter y el setter pueden tener un tipo diferente. Además, el getter y / o el setter pueden anularse en una subclase, que es exactamente el caso de EditText en Android.

En el caso anterior, la clase Android TextView contiene un captador

CharSequence getText() 

y un setter nulo

setText(CharSequence)

Si tuviera una variable de tipo TextView, mi código habría funcionado bien. Pero usé la clase EditText que contiene un captador anulado

Editable getText()

lo que significa que puede obtener un Editable para un EditText y establecer un Editable en un EditText. Por lo tanto, Kotlin crea razonablemente un texto de propiedad sintética de tipo Editable. Como la clase String no es editable, es por eso que no puedo asignar una instancia de String a la propiedad de texto de la clase EditText.

Parece que JetBrains olvidó especificar el papel dominante de los métodos getter al generar propiedades kotlin para los métodos getter y setter de Java. De todos modos, he enviado una solicitud de extracción al sitio web de Jet brains kotlin a través de github.

También he detallado el problema anterior en esta publicación de medio. ¿Cómo genera Kotlin propiedades a partir de captadores y establecedores de Java (sin documentar por Jetbrains)?


0

Tuve el mismo problema en mis proyectos, les doy un ejemplo que muestra cómo recuperar y establecer datos en los diseños usando Kotlin: hay un botón save_buttony dos campos de edición de texto edit_namey 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")
                }

0

Solución simple

Simplemente use edittext.setText(yourdata) en lugar de edittext.textporque EditText es editable, edittext.textse usa paraTextView

Por ejemplo:

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

Ese es su trabajo para mí.


0

Usar así:

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

-1

setText (String), por lo que debe establecer su cadena de texto para editText, por lo que en su caso es: nametxt.setText (name)


-2

O fundido a TextViewpero yo creo que esto debe fijarse en el lado Kotlin seguro para mayor comodidad de los desarrolladores!

(someEditText as TextView).text = "someTextValue"

O con algunas extensiones:

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

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

Puedes escribir:

someEditText.asTextView.text = "someTextValue"

o

someEditText.value = "someTextValue"

Pero lamentablemente no puedes escribir simplesomeEditText.text = "someTextValue"



-6

Intente usar nametxt.post: nametxt.post ({nametxt.setText ("su texto")})

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.