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.

Paramjeet Singh
fuente
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.

nhaarman
fuente
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.

Rahul Khurana
fuente
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()
BNY
fuente
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)
Evgeniy Pavlov
fuente
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=

letroll
fuente
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)?

Abhishek Luthra
fuente
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")
                }
Sadiki Ayoub
fuente
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í.

Muzammil
fuente
0

Usar así:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
sana ebadi
fuente
-1

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

Edwin Kurnia Rahman
fuente
-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"

Renetik
fuente
-6

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

Denys Lobur
fuente