Festlegen von Text in EditText Kotlin

147

Ich versuche, Text in einem EditText festzulegen, aber es heißt:

Type mismatch. 
Required: Editable 
Found: String

Mein Code lautet wie folgt:

String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name

Sagen Sie nicht zu verwenden, setTextweil ich Kotlin verwende, nicht Java.

Paramjeet Singh
quelle
Nebenbei: Sie benötigen findViewById nicht, wenn Sie die Kotlin Android-Erweiterungen verwenden (im Lieferumfang von Android Studio enthalten). Sie sollten nur nexttxt.setText(name)ohne Fund oder Casting anrufen können.
AjahnCharles
Dies ist kein Kotlin-Code, da Sie @Singh
Sazzad Hissain Khan

Antworten:

310

Verwenden Sie setText(String), da editText.texterwartet ein Editable, nicht ein String.

Nhaarman
quelle
Weder EditText wird nach setText () fokussiert, noch wird die softInput-Tastatur geöffnet
Saurabh Bhandari
Aber wieso? Es klingt so ähnlich !!
Malwinder Singh
36

Verwendung setText(String)als EditText.texterfordert ein editablebei Firstplace nicht String

WARUM ?

Schöne Erklärung von Michael unter diesem Link . Besuchen Sie diesen Link für weitere Details

Beim Generieren einer synthetischen Eigenschaft für ein Java-Getter / Setter-Paar sucht Kotlin zuerst nach einem Getter. Der Getter reicht aus, um mit einem Getter-Typ eine synthetische Eigenschaft zu erstellen. Auf der anderen Seite wird die Eigenschaft nicht erstellt, wenn nur ein Setter präsentiert.

Wenn ein Setter ins Spiel kommt, wird die Erstellung von Eigenschaften schwieriger. Der Grund ist, dass der Getter und der Setter unterschiedliche Typen haben können. Darüber hinaus können der Getter und / oder der Setter in einer Unterklasse überschrieben werden.

Rahul Khurana
quelle
22

Hier gibt es mehrere funktionierende Antworten. Wenn Sie jedoch weiterhin das Eigenschaftsformat verwenden und Ihren Code sauber aussehen lassen möchten, können Sie eine Erweiterung schreiben:

fun String.toEditable(): Editable =  Editable.Factory.getInstance().newEditable(this)

Sie können es dann als solches verwenden:

mEditText.text = myString.toEditable()
BNY
quelle
1
Der Erweiterungsansatz ist besser als die Verwendung des alten Java-SetText.
Piotr Badura
18

Wenn Sie Getter .textaus Prinzip verwenden möchten , verwenden Sie:

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

Oder Sie können eine Erweiterungseigenschaft verwenden:

var EditText.value
    get() = this.text.toString()
    set(value) {
            this.setText(value)
    }

und verwenden .value=statt.text=

letroll
quelle
2

Methoden, die den Java-Konventionen für Getter und Setter folgen (Methoden ohne Argumente mit Namen, die mit get beginnen, und Methoden mit einem Argument, deren Namen mit set beginnen), werden in Kotlin als Eigenschaften dargestellt. Beim Generieren einer Eigenschaft für ein Java-Getter / Setter-Paar sucht Kotlin zunächst nach einem Getter. Der Getter reicht aus, um den Typ der Eigenschaft aus dem Typ des Getters abzuleiten. Auf der anderen Seite wird die Eigenschaft nicht erstellt, wenn nur ein Setter vorhanden ist (da Kotlin derzeit keine Nur-Satz-Eigenschaften unterstützt).

Wenn ein Setter ins Spiel kommt, wird der Prozess der Eigenschaftsgenerierung etwas mehrdeutig. Der Grund ist, dass der Getter und der Setter unterschiedliche Typen haben können. Darüber hinaus können der Getter und / oder der Setter in einer Unterklasse überschrieben werden, was genau bei EditText in Android der Fall ist.

Im obigen Fall enthält die Android TextView-Klasse einen Getter

CharSequence getText() 

und ein Setter nichtig

setText(CharSequence)

Wenn ich eine Variable vom Typ TextView hätte, hätte mein Code gut funktioniert. Aber ich habe die EditText-Klasse verwendet, die einen überschriebenen Getter enthält

Editable getText()

Dies bedeutet, dass Sie eine Bearbeitbarkeit für einen EditText erhalten und eine Bearbeitbarkeit für einen EditText festlegen können. Daher erstellt Kotlin vernünftigerweise einen synthetischen Eigenschaftstext vom Typ Editable. Da die String-Klasse nicht bearbeitbar ist, kann ich der text-Eigenschaft der EditText-Klasse keine String-Instanz zuweisen.

Es scheint, als hätte JetBrains vergessen, die dominierende Rolle von Getter-Methoden beim Generieren von Kotlin-Eigenschaften für Java-Getter- und Setter-Methoden anzugeben. Wie auch immer, ich habe über github eine Pull-Anfrage an die Website von Jet Brains Kotlin gesendet.

Ich habe das obige Problem auch in diesem mittleren Beitrag ausführlich beschrieben. Wie generiert Kotlin Eigenschaften aus Java-Gettern und -Setzern (undokumentiert von Jetbrains)?

Abhishek Luthra
quelle
0

Ich hatte das gleiche Problem in meinen Projekten. Ich gebe Ihnen ein Beispiel, das zeigt, wie Daten mit Kotlin in den Layouts abgerufen und festgelegt werden: Es gibt eine Schaltfläche save_buttonund zwei Textbearbeitungsfelder edit_nameund 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
quelle
0

Einfache Lösung

Verwenden Sie einfach edittext.setText(yourdata) anstatt edittext.textweil der EditText bearbeitet werden kann, edittext.textwird der für verwendetTextView

Beispielsweise:

var name:String = "Muzammil"
edittext.setText(name)

Das ist es seine Arbeit für mich.

Muzammil
quelle
0

Verwenden Sie wie folgt:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
Sana Ebadi
quelle
-1

setText (String), daher müssen Sie Ihren String auf editText setzen, also in Ihrem Fall: nametxt.setText (name)

Edwin Kurnia Rahman
quelle
-2

Oder gegossen , TextViewaber ich glaube, dies sollte auf der Kotlin-Seite behoben werden, um den Entwicklern die Arbeit zu erleichtern!

(someEditText as TextView).text = "someTextValue"

Oder mit einigen Erweiterungen:

val EditText.asTextView: TextView get() = this as TextView

var EditText.value: CharSequence? 
    get() = asTextView.text
    set(value) {
        asTextView.text = value
    }

Du kannst schreiben:

someEditText.asTextView.text = "someTextValue"

oder

someEditText.value = "someTextValue"

Aber leider kann man einfach nicht einfach schreibensomeEditText.text = "someTextValue"

Renetik
quelle
-6

Versuchen Sie es mit nametxt.post: nametxt.post ({nametxt.setText ("Ihr Text")})

Denys Lobur
quelle