web-dev-qa-db-fra.com

Définition du texte dans EditText Kotlin

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

60
Paramjeet Singh

Utilisez setText(String), puisque editText.text attend une Editable et non une String.

141
nhaarman

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.

24
Rahul Khurana

Si vous voulez utiliser le getter .text du principe, utilisez:

nametxt.text = Editable.Factory.getInstance().newEditable(name)
9
Evgeniy Pavlov

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()
8
BNY

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 =

2
letroll

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)

2
Abhishek Luthra
editText.setText("Your text here")
0
Masum