Ustawianie tekstu w EditText Kotlin


147

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ć, setTextponieważ używam kotlin, a nie Java.



Poza tym: nie potrzebujesz findViewById, jeśli używasz rozszerzeń Kotlin dla systemu Android (dostarczanych z Android Studio). Powinieneś być w stanie zadzwonić nexttxt.setText(name)bez szukania lub przesyłania.
AjahnCharles

To nie jest kod Kotlin, jak twierdzisz @Singh
Sazzad Hissain Khan,

Odpowiedzi:



36

Posługiwać się setText(String) zgodnie z EditText.textwymaganiami editableat firstplace not String

CZEMU ?

Ł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.


22

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:

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

Możesz wtedy użyć go jako takiego:

mEditText.text = myString.toEditable()

1
Podejście rozszerzeń jest lepsze niż używanie starego java setText.
Piotr Badura

18

Jeśli chcesz użyć metody getter .textfrom, użyj:

nametxt.text = Editable.Factory.getInstance().newEditable(name)

3

Możesz też użyć właściwości rozszerzenia:

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

i użyj .value=zamiast.text=


2

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ą

CharSequence getText() 

i seter próżnia

setText(CharSequence)

Gdybym miał zmienną typu TextView, mój kod działałby dobrze. Ale użyłem klasy EditText, która zawiera nadpisany getter

Editable getText()

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)


0

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_buttoni dwa pola edycji tekstu edit_namei 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")
                }

0

Proste rozwiązanie

Po prostu użyj edittext.setText(yourdata) zamiast, edittext.textponieważ EditText jest edytowalny, edittext.textjest używany doTextView

Na przykład:

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

To jest jego praca dla mnie.


0

Użyj w ten sposób:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))

-1

setText (String), więc musisz ustawić swój ciąg na editText, więc w twoim przypadku jest to: nametxt.setText (nazwa)


-2

Lub rzuć na, TextViewale uważam, że powinno to być naprawione po stronie kotlina dla wygody programistów!

(someEditText as TextView).text = "someTextValue"

Lub z niektórymi rozszerzeniami:

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

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

Możesz pisać:

someEditText.asTextView.text = "someTextValue"

lub

someEditText.value = "someTextValue"

Ale niestety po prostu nie możesz pisać prostosomeEditText.text = "someTextValue"



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.