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.

Paramjeet Singh
la source
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.

nhaarman
la source
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.

Rahul Khurana
la source
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()
BNY
la source
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)
Evgeniy Pavlov
la source
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=

Letroll
la source
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)

Abhishek Luthra
la source
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")
                }
Sadiki Ayoub
la source
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.

Muzammil
la source
0

Utilisez comme ceci:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
sana ebadi
la source
-1

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

Edwin Kurnia Rahman
la source
-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"

Renetik
la source
-6

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

Denys Lobur
la source