Próbuję ustawić tekst w EditText, ale mówi:
Type mismatch.
Required: Editable
Found: String
Mój kod wygląda następująco:
String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name
Nie mów, aby używać, setText
ponieważ używam kotlin, a nie Java.
android
kotlin
android-edittext
Paramjeet Singh
źródło
źródło
nexttxt.setText(name)
bez szukania lub przesyłania.Odpowiedzi:
Użyj
setText(String)
, ponieważeditText.text
oczekujeEditable
, a nieString
.źródło
Posługiwać się
setText(String)
zgodnie zEditText.text
wymaganiamieditable
at firstplace not StringCZEMU ?
Ładne wyjaśnienie przez Michała podane pod tym linkiem . Odwiedź ten link, aby uzyskać więcej informacji
Podczas generowania właściwości syntetycznej dla pary pobierającej / ustawiającej w Javie Kotlin najpierw szuka metody pobierającej. Funkcja pobierająca wystarczy do utworzenia właściwości syntetycznej z rodzajem metody pobierającej. Z drugiej strony własność nie zostanie utworzona, jeśli tylko przedstawi ustawiający.
Kiedy do gry wkracza rozgrywający, tworzenie własności staje się trudniejsze. Powodem jest to, że metoda pobierająca i ustawiająca mogą mieć różne typy. Ponadto metoda pobierająca i / lub ustawiająca może zostać nadpisana w podklasie.
źródło
Jest tutaj kilka działających odpowiedzi, ale jeśli nadal chcesz używać formatu właściwości i sprawić, by kod wyglądał czysto, możesz napisać rozszerzenie:
Możesz wtedy użyć go jako takiego:
źródło
Jeśli chcesz użyć metody getter
.text
from, użyj:źródło
Możesz też użyć właściwości rozszerzenia:
i użyj
.value=
zamiast.text=
źródło
Metody, które są zgodne z konwencjami języka Java dla metod pobierających i ustawiających (metody bezargumentowe o nazwach zaczynających się od get i metody jednoargumentowe o nazwach zaczynających się od set) są reprezentowane jako właściwości w Kotlinie. Jednak podczas generowania właściwości dla pary pobierającej / ustawiającej Javy Kotlin najpierw szuka metody pobierającej. Metoda pobierająca jest wystarczająca, aby wywnioskować typ właściwości na podstawie typu metody pobierającej. Z drugiej strony właściwość nie zostanie utworzona, jeśli obecny jest tylko ustawiający (ponieważ Kotlin nie obsługuje obecnie właściwości tylko zestawu).
Kiedy w grę wchodzi ustawiacz, proces generowania nieruchomości staje się nieco niejednoznaczny. Powodem jest to, że metoda pobierająca i ustawiająca mogą mieć różne typy. Co więcej, metoda pobierająca i / lub ustawiająca może zostać zastąpiona w podklasie, co dokładnie ma miejsce w przypadku EditText w systemie Android.
W powyższym przypadku klasa Android TextView zawiera metodę pobierającą
i seter próżnia
Gdybym miał zmienną typu TextView, mój kod działałby dobrze. Ale użyłem klasy EditText, która zawiera nadpisany getter
co oznacza, że możesz uzyskać Editable dla EditText i ustawić Editable na EditText. Dlatego Kotlin rozsądnie tworzy syntetyczny tekst właściwości typu Edytowalny. Ponieważ klasy String nie można edytować, nie mogę przypisać instancji String do właściwości text klasy EditText.
Wygląda na to, że JetBrains zapomniał określić dominującą rolę metod pobierających podczas generowania właściwości kotlin dla metod pobierających i ustawiających w języku Java. Tak czy inaczej, wysłałem prośbę o ściągnięcie do strony Jet Brains kotlin przez github.
Szczegółowo opisałem powyższy problem w tym średnim poście. Jak Kotlin generuje właściwość z Java Getters i Setters (nieudokumentowane przez Jetbrains)
źródło
Miałem ten sam problem w swoich projektach, podaję przykład, który pokazuje, jak pobierać i ustawiać dane w układach za pomocą Kotlina: jest jeden przycisk
save_button
i dwa pola edycji tekstuedit_name
iedit_password
.źródło
Proste rozwiązanie
Po prostu użyj
edittext.setText(yourdata
) zamiast,edittext.text
ponieważ EditText jest edytowalny,edittext.text
jest używany doTextView
Na przykład:
To jest jego praca dla mnie.
źródło
Użyj w ten sposób:
źródło
setText (String), więc musisz ustawić swój ciąg na editText, więc w twoim przypadku jest to: nametxt.setText (nazwa)
źródło
Lub rzuć na,
TextView
ale uważam, że powinno to być naprawione po stronie kotlina dla wygody programistów!Lub z niektórymi rozszerzeniami:
Możesz pisać:
lub
Ale niestety po prostu nie możesz pisać prosto
someEditText.text = "someTextValue"
źródło
Spójrz na interfejs API EditText:
void setText (CharSequence text, TextView.BufferType type)
Editable getText ()
Link: https://developer.android.com/reference/android/widget/EditText.html
źródło
Spróbuj użyć nametxt.post: nametxt.post ({nametxt.setText ("twój tekst")})
źródło