J'essaie de définir du texte dans un edittext, mais il indique une incompatibilité de type Obligatoire Chaîne trouvée modifiable, mon code est le suivant
String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name
Ne dites pas à utiliser SetText parce que j'utilise kotlin pas Java
Utilisez setText(String)
, puisque editText.text
attend une Editable
et non une String
.
Utiliser setText(String)
comme EditText.text
requiert une editable
au premier lieu et non une chaîne
POURQUOI ?
Belle explication par 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 de 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. D'autre part, la propriété ne sera pas créée si seul un poseur est présent.
Quand un setter 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 remplacés dans une sous-classe.
Si vous voulez utiliser le getter .text
du principe, utilisez:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
Il y a plusieurs réponses de travail ici, mais si vous voulez toujours utiliser le format de propriété et avoir votre code 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()
ou vous pouvez utiliser une propriété d'extension:
var EditText.value
get() = this.text.toString()
set(value) {
this.setText(value)
}
et utilisez .value = au lieu de .text =
Les méthodes qui suivent les conventions Java pour les getters et les setters (les méthodes sans argument avec les noms commençant par get et les méthodes à un argument avec les noms commençant par set) sont représentées en tant que propriétés dans Kotlin . Mais, tout en générant une propriété pour une paire de getter/setter Java, Kotlin cherche d'abord un getter. Le getter est suffisant pour 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 séparateur est présent (car Kotlin ne prend pas en charge pour le moment les propriétés d'ensemble).
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 un type différent. De plus, le getter et/ou le setter peuvent être remplacés dans une sous-classe, ce qui est exactement le cas d'EditText dans Android.
Dans le cas ci-dessus, la classe Android TextView contient un getter.
CharSequence getText()
et un passeur vide
setText(CharSequence)
Si j'avais une variable de type TextView, mon code aurait très bien fonctionné . 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 Editable à 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 éditable, c’est pourquoi je ne peux pas attribuer une occurrence String à la propriété text de la classe EditText.
On dirait que JetBrains a 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 envoyé une demande de tirage sur le site Web de Jet brains kotlin par l’intermédiaire de github.
J'ai aussi détaillé le problème ci-dessus dans ce post moyen Comment Kotlin génère-t-elle une propriété à partir de getters et setters Java (non documentée par Jetbrains)
editText.setText("Your text here")