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.

Paramjeet Singh
źródło
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:

310

Użyj setText(String), ponieważ editText.textoczekuje Editable, a nie String.

nhaarman
źródło
ani EditText nie jest aktywowany po setText (), ani klawiatura softInput nie jest otwarta
Saurabh Bhandari
Ale dlaczego? Brzmi podobnie!
Malwinder Singh
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.

Rahul Khurana
źródło
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()
BNY
źródło
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)
Evgeniy Pavlov
źródło
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=

letroll
źródło
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)

Abhishek Luthra
źródło
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")
                }
Sadiki Ayoub
źródło
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.

Muzammil
źródło
0

Użyj w ten sposób:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
sana ebadi
źródło
-1

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

Edwin Kurnia Rahman
źródło
-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"

Renetik
źródło
-6

Spróbuj użyć nametxt.post: nametxt.post ({nametxt.setText ("twój tekst")})

Denys Lobur
źródło