Définition du texte dans EditText Kotlin


148

J'essaie de définir du texte dans un EditText mais il dit:

Type mismatch. 
Required: Editable 
Found: String

Mon code est le suivant:

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

Ne dites pas d'utiliser setTextparce que j'utilise kotlin, pas Java.



En plus: vous n'avez pas besoin de findViewById si vous utilisez les extensions Kotlin Android (fournies avec Android Studio). Vous devriez simplement pouvoir appeler nexttxt.setText(name)sans aucune recherche ni diffusion.
AjahnCharles

Ce n'est pas un code Kotlin comme vous le prétendez @Singh
Sazzad Hissain Khan

Réponses:


310

Utilisation setText(String) , car editText.textattend un Editable, pas un String.


ni EditText n'obtient le focus après setText () ni le clavier softInput ouvert
Saurabh Bhandari

Mais pourquoi? Cela semble si similaire !!
Malwinder Singh

36

Utiliser setText(String)comme EditText.textnécessite une editablechaîne au départ

POURQUOI ?

Belle explication de Michael donnée sous ce lien . Visitez ce lien pour plus de détails

Lors de la génération d'une propriété synthétique pour une paire getter / setter Java, Kotlin recherche d'abord un getter. Le getter suffit à créer une propriété synthétique avec un type de getter. En revanche, la propriété ne sera pas créée si seul un setter présente.

Lorsqu'un passeur entre en jeu, la création de propriété devient plus difficile. La raison en est que le getter et le setter peuvent avoir un type différent. De plus, le getter et / ou le setter peuvent être surchargés dans une sous-classe.


22

Il existe plusieurs réponses de travail ici, mais si vous souhaitez toujours utiliser le format de propriété et que votre code soit propre, vous pouvez écrire une extension:

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

Vous pouvez ensuite l'utiliser comme tel:

mEditText.text = myString.toEditable()

1
L'approche d'extension est meilleure que l'utilisation de l'ancien java setText.
Piotr Badura

18

Si vous souhaitez utiliser getter .textpar principe, utilisez:

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

3

Ou vous pouvez utiliser une propriété d'extension:

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

et utilisez à la .value=place de.text=


2

Les méthodes qui suivent les conventions Java pour les getters et les setters (méthodes sans argument avec des noms commençant par get et méthodes à argument unique avec des noms commençant par set) sont représentées comme des propriétés dans Kotlin. Mais, tout en générant une propriété pour une paire getter / setter Java, Kotlin recherche d'abord un getter. Le getter suffit à déduire le type de propriété du type du getter. D'autre part, la propriété ne sera pas créée si seul un setter est présent (car Kotlin ne prend pas en charge les propriétés définies uniquement pour le moment).

Lorsqu'un setter entre en jeu, le processus de génération de propriété devient un peu ambigu. La raison en est que le getter et le setter peuvent avoir un type différent. De plus, le getter et / ou le setter peuvent être surchargés dans une sous-classe, ce qui est exactement le cas de EditText sous Android.

Dans le cas ci-dessus, la classe Android TextView contient un getter

CharSequence getText() 

et un vide de setter

setText(CharSequence)

Si j'avais une variable de type TextView, mon code aurait bien fonctionné. Mais j'ai utilisé la classe EditText qui contient un getter remplacé

Editable getText()

ce qui signifie que vous pouvez obtenir un Editable pour un EditText et définir un Editable sur un EditText. Par conséquent, Kotlin crée raisonnablement un texte de propriété synthétique de type Editable. Comme la classe String n'est pas modifiable, c'est pourquoi je ne peux pas affecter une instance String à la propriété text de la classe EditText.

Il semble que JetBrains ait oublié de spécifier le rôle dominant des méthodes getter lors de la génération des propriétés kotlin pour les méthodes getter et setter Java. Quoi qu'il en soit, j'ai soumis une demande de tirage au site Web de Jet Brains Kotlin via github.

J'ai également détaillé le problème ci-dessus dans ce message moyen Comment Kotlin génère-t-il des propriétés à partir de Java Getters and Setters (non documenté par Jetbrains)


0

J'ai eu le même problème dans mes projets, je vous donne un exemple qui montre comment récupérer et définir des données dans les mises en page à l'aide de Kotlin: il y a un bouton save_buttonet deux champs d'édition de texte edit_nameet 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

Solution simple

Utilisez simplement edittext.setText(yourdata) au lieu de edittext.textparce que EditText est modifiable, le edittext.textest utilisé pourTextView

Par exemple:

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

C'est son travail pour moi.


0

Utilisez comme ceci:

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

-1

setText (String), vous devez donc setText votre chaîne pour editText, donc dans votre cas est: nametxt.setText (nom)


-2

Ou casting pour TextViewmais je crois que cela devrait être fixé sur le côté Kotlin sûr pour la commodité des développeurs!

(someEditText as TextView).text = "someTextValue"

Ou avec quelques extensions:

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

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

Tu peux écrire:

someEditText.asTextView.text = "someTextValue"

ou

someEditText.value = "someTextValue"

Mais malheureusement, vous ne pouvez pas écrire simplementsomeEditText.text = "someTextValue"



-6

Essayez d'utiliser nametxt.post: nametxt.post ({nametxt.setText ("votre texte")})

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.