257 votes

Définition du texte dans EditText Kotlin

J'essaie de définir le texte d'un EditText mais il est indiqué :

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 qu'il faut utiliser setText parce que j'utilise Kotlin, et non Java.

0 votes

Aside : Vous n'avez pas besoin de findViewById si vous utilisez les extensions Android Kotlin (livrées avec Android Studio). Vous devriez simplement pouvoir appeler nexttxt.setText(name) sans aucune recherche ou casting.

3 votes

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

496voto

Niek Haarman Points 13931

Utilice setText(String) puisque editText.text attend un Editable et non un String .

0 votes

Ni l'EditText n'obtient le focus après setText() ni le clavier softInput ne s'ouvre

0 votes

Mais pourquoi ? Ça a l'air tellement similaire !

0 votes

Voilà pour la volonté de Kotlin d'éviter la syntaxe d'utilisation des propriétés de Java ! Yup, la méthode setter est jetée par la fenêtre !

48voto

Rahul Khurana Points 2865

Utilice setText(String) como EditText.text nécessite un editable en premier lieu pas String

POURQUOI ?

Bonne explication par Michael donné sous ce lien . Visitez ce lien pour plus de détails

Lorsqu'il génère une propriété synthétique pour une paire getter/setter Java, Kotlin recherche d'abord un getter. Le getter est suffisant pour créer une propriété synthétique avec un type du getter. En revanche, la propriété ne sera pas créée si seul un setter est présent.

Lorsqu'un setter entre en jeu, la création de propriétés 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.

43voto

BNY Points 91

Il y a plusieurs réponses fonctionnelles ici, mais si vous voulez 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 alors l'utiliser comme tel :

mEditText.text = myString.toEditable()

3 votes

L'approche d'extension est meilleure que l'utilisation de l'ancien setText de Java.

2 votes

Mieux vaut faire une extension pour éditer le texte : fun EditText.setEditableText(text:String){ this.text = Editable.Factory.getInstance().newEditable(text) }

25voto

Evgeniy Pavlov Points 141

Si vous voulez utiliser le getter .text du principe, de l'utilisation :

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

3voto

Abhishek Luthra Points 585

Les méthodes qui suivent les conventions Java pour les getters et setters (méthodes sans argument dont le nom commence par get et méthodes à argument unique dont le nom commence par set) sont représentées comme des propriétés dans Kotlin. Mais, lorsqu'il génère une propriété pour une paire getter/setter Java, Kotlin recherche d'abord un getter. Le getter est suffisant pour déduire le type de la propriété à partir du type du getter. En revanche, 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 set-only pour le moment).

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

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

CharSequence getText() 

et un setter void

setText(CharSequence)

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

Editable getText()

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

Il semble que JetBrains a oublié de spécifier le rôle dominant des méthodes getter tout en générant des propriétés kotlin pour les méthodes getter et setter Java. Quoi qu'il en soit, j'ai soumis une demande de pull au site Web de Jet brains kotlin via github.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X