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 setText
parce que j'utilise kotlin, pas Java.
android
kotlin
android-edittext
Paramjeet Singh
la source
la source
nexttxt.setText(name)
sans aucune recherche ni diffusion.Réponses:
Utilisation
setText(String)
, careditText.text
attend unEditable
, pas unString
.la source
Utiliser
setText(String)
commeEditText.text
nécessite uneeditable
chaîne au départPOURQUOI ?
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.
la source
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:
Vous pouvez ensuite l'utiliser comme tel:
la source
Si vous souhaitez utiliser getter
.text
par principe, utilisez:la source
Ou vous pouvez utiliser une propriété d'extension:
et utilisez à la
.value=
place de.text=
la source
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
et un vide de setter
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é
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)
la source
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_button
et deux champs d'édition de texteedit_name
etedit_password
.la source
Solution simple
Utilisez simplement
edittext.setText(yourdata
) au lieu deedittext.text
parce que EditText est modifiable, leedittext.text
est utilisé pourTextView
Par exemple:
C'est son travail pour moi.
la source
Utilisez comme ceci:
la source
setText (String), vous devez donc setText votre chaîne pour editText, donc dans votre cas est: nametxt.setText (nom)
la source
Ou casting pour
TextView
mais je crois que cela devrait être fixé sur le côté Kotlin sûr pour la commodité des développeurs!Ou avec quelques extensions:
Tu peux écrire:
ou
Mais malheureusement, vous ne pouvez pas écrire simplement
someEditText.text = "someTextValue"
la source
Regardez l'API d'EditText:
void setText (CharSequence text, TextView.BufferType type)
Editable getText ()
Lien: https://developer.android.com/reference/android/widget/EditText.html
la source
Essayez d'utiliser nametxt.post: nametxt.post ({nametxt.setText ("votre texte")})
la source