web-dev-qa-db-de.com

Text in EditText Kotlin einstellen

Ich versuche, Text in einem Edittext festzulegen, aber er sagt, dass Typenkonflikt erforderlich ist. Editierbare gefundene Zeichenfolge. Mein Code lautet wie folgt

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

Sagen Sie nicht, SetText zu verwenden, weil ich Kotlin nicht Java verwende

60
Paramjeet Singh

Verwenden Sie setText(String), da editText.text eine Editable und keine String erwartet.

141
nhaarman

Verwenden Sie setText(String), da EditText.text eine editable an erster Stelle und keine Zeichenfolge erfordert

WARUM ?

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

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

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

24
Rahul Khurana

Wenn Sie Getter .text grundsätzlich verwenden möchten, verwenden Sie:

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

Es gibt mehrere funktionierende Antworten, aber wenn Sie das Eigenschaftenformat trotzdem verwenden möchten und Ihr Code sauber aussehen soll, 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()
8
BNY

oder Sie können eine Erweiterungseigenschaft verwenden:

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

und verwenden Sie .value = anstelle von .text =

2
letroll

Methoden, die den Java-Konventionen für Getter und Setter folgen (Methoden ohne Argumente, deren Namen mit get beginnen, und Methoden mit einem einzigen Argument, deren Namen mit set beginnen) werden in Kotlin ..__ als Eigenschaften dargestellt. Beim Erstellen einer Eigenschaft für ein Java-Getter/Setter-Paar sucht Kotlin jedoch 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 Set-Eigenschaften unterstützt).

Wenn ein Setter ins Spiel kommt, wird der Eigenschaftserzeugungsprozess ein bisschen mehrdeutig. Der Grund ist, dass der Getter und der Setter einen anderen Typ haben können. Darüber hinaus können der Getter und/oder der Setter in einer Unterklasse, .__, überschrieben werden. was genau der Fall von EditText in Android ist.

In diesem Fall enthält die Android-TextView-Klasse einen Getter

CharSequence getText() 

und eine Setzerleere

setText(CharSequence)

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

Editable getText()

dies bedeutet, dass Sie ein Editable für einen EditText erhalten und ein Editable auf einen EditText setzen können. Daher erstellt Kotlin sinnvollerweise einen synthetischen Eigenschaftstext vom Typ Editable. Da die String-Klasse nicht editierbar ist, kann ich der Texteigenschaft der EditText-Klasse keine String-Instanz zuweisen.

Es scheint, als hätte JetBrains vergessen, die dominante Rolle von Getter-Methoden anzugeben, während Kotlin-Eigenschaften für Java-Getter- und Setter-Methoden generiert werden. Wie auch immer, ich habe eine Pull-Anfrage an Jet Brains Kotlin Website über Github eingereicht. 

Ich habe das obige Problem auch in diesem mittleren Beitrag detailliert beschrieben Wie erzeugt Kotlin Eigenschaft von Java-Getigtern und Setters (undokumentiert von Jetbrains)

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