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
Verwenden Sie setText(String)
, da editText.text
eine Editable
und keine String
erwartet.
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.
Wenn Sie Getter .text
grundsätzlich verwenden möchten, verwenden Sie:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
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()
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 =
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)
editText.setText("Your text here")