Menyetel teks di EditText Kotlin


166

Saya mencoba untuk menyetel teks dalam EditText tetapi dikatakan:

Type mismatch. 
Required: Editable 
Found: String

Kode saya adalah sebagai berikut:

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

Jangan katakan untuk menggunakan setTextkarena saya menggunakan kotlin, bukan Java.



Selain: Anda tidak memerlukan findViewById jika Anda menggunakan ekstensi Android Kotlin (dikirimkan bersama Android Studio). Anda seharusnya dapat menelepon nexttxt.setText(name)tanpa menemukan atau mentransmisi.
AjahnCharles

Ini bukan kode Kotlin karena Anda mengklaim @Singh
Sazzad Hissain Khan

@VladyslavMatviienko: Ya, kami harus menghapus utas ini karena setiap orang yang tidak dapat menyetel teks di kotlin EditText mereka akan langsung berpikir untuk mencari "sintaks akses properti kotlin untuk kelas java." Itu hal pertama yang muncul di kepala saya ketika saya melihat kesalahan kompiler itu.
SMBiggs

Jawaban:


345

Gunakan setText(String), karena editText.textmengharapkan Editable, bukan String.


Tidak ada EditText mendapatkan fokus setelah setText () atau keyboard softInput terbuka
Saurabh Bhandari

Tapi kenapa? Kedengarannya sangat mirip !!
Malwinder Singh

Begitu banyak keinginan Kotlin untuk menghindari properti java, gunakan sintaks! Yup, metode penyetel dilempar keluar jendela!
SMBiggs

Terima kasih atas jawabannya. Ini membantu saya.
thesamoanppprogrammer

38

Gunakan setText(String)sebagai yang pertama kali EditText.textdiperlukan, editablebukan String

MENGAPA?

Penjelasan bagus oleh Michael diberikan di bawah tautan ini . Kunjungi tautan ini untuk detail lebih lanjut

Saat membuat properti sintetik untuk pasangan pengambil / penyetel Java, pertama-tama Kotlin mencari pengambil. Getter cukup untuk membuat properti sintetik dengan tipe getter. Di sisi lain, properti tidak akan dibuat jika hanya ada penyetel.

Ketika seorang setter ikut bermain, pembuatan properti menjadi lebih sulit. Alasannya adalah pengambil dan penyetel mungkin memiliki tipe yang berbeda. Selain itu, pengambil dan / atau penyetel dapat diganti dalam subkelas.


29

Ada beberapa jawaban yang berfungsi di sini, tetapi jika Anda masih ingin menggunakan format properti dan kode Anda terlihat bersih, Anda dapat menulis ekstensi:

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

Anda kemudian dapat menggunakannya seperti itu:

mEditText.text = myString.toEditable()

1
Pendekatan ekstensi lebih baik daripada menggunakan setText java lama.
Piotr Badura

1
Lebih baik lakukan ekstensi untuk mengedit teks: fun EditText.setEditableText (teks: String) {this.text = Editable.Factory.getInstance (). NewEditable (text)}
Evgeniy Pavlov

20

Jika Anda ingin menggunakan getter .textfrom principle, gunakan:

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

5

Atau Anda dapat menggunakan properti ekstensi:

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

dan gunakan .value=sebagai pengganti.text=


3

Metode yang mengikuti konvensi Java untuk getter dan setter (metode tanpa argumen dengan nama yang dimulai dengan get dan metode argumen tunggal dengan nama yang dimulai dengan set) direpresentasikan sebagai properti di Kotlin. Tapi, Saat membuat properti untuk pasangan pengambil / penyetel Java, Kotlin pada awalnya mencari pengambil. Getter cukup untuk menyimpulkan tipe properti dari tipe getter. Di sisi lain, properti tidak akan dibuat jika hanya ada setter (karena Kotlin tidak mendukung properti set-only saat ini).

Ketika seorang penyetel ikut bermain, proses pembuatan properti menjadi agak ambigu. Alasannya adalah pengambil dan penyetel mungkin memiliki tipe yang berbeda. Selain itu, pengambil dan / atau penyetel dapat diganti dalam subkelas, yang merupakan kasus EditText di android.

Dalam kasus di atas, kelas Android TextView berisi getter

CharSequence getText() 

dan kekosongan penyetel

setText(CharSequence)

Jika saya memiliki variabel tipe TextView, kode saya akan berfungsi dengan baik. Tapi saya menggunakan kelas EditText yang berisi getter yang diganti

Editable getText()

yang berarti Anda bisa mendapatkan Editable untuk EditText dan menyetel Editable ke EditText. Oleh karena itu, Kotlin membuat teks properti sintetis berjenis Editable. Karena kelas String tidak dapat diedit, itulah mengapa saya tidak dapat menetapkan instance String ke properti teks kelas EditText.

Sepertinya JetBrains lupa untuk menentukan peran dominan metode pengambil saat membuat properti kotlin untuk metode pengambil dan penyetel Java. Bagaimanapun, saya telah mengirimkan permintaan tarik ke situs web Jet brains kotlin melalui github.

Saya telah merinci masalah di atas dalam posting media ini juga Bagaimana Kotlin Menghasilkan Properti dari Java Getters and Setters (Tidak didokumentasikan oleh Jetbrains)


2

Solusi Sederhana

Cukup gunakan edittext.setText(yourdata) daripada edittext.textkarena EditText dapat diedit, edittext.texttetapi digunakan untukTextView

Sebagai contoh:

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

Itu pekerjaannya untuk saya.


1
Penjelasan yang sedikit lebih baik dari jawaban nhaarman.
SMBiggs

1

Saya memiliki masalah yang sama dalam proyek saya, saya memberi Anda contoh yang menunjukkan cara mengambil dan mengatur data dalam tata letak menggunakan Kotlin: ada satu tombol save_buttondan dua bidang edit teks edit_namedan 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")
                }

1

Gunakan seperti ini:

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

1

Atau cast ke TextViewtapi saya yakin ini harus diperbaiki di sisi kotlin untuk kenyamanan pengembang!

(someEditText as TextView).text = "someTextValue"

Atau dengan beberapa ekstensi:

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

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

Kamu bisa menulis:

someEditText.asTextView.text = "someTextValue"

atau

someEditText.value = "someTextValue"

Tapi sayangnya Anda tidak bisa menulis sederhanasomeEditText.text = "someTextValue"


Mengapa ini ditolak? Sepertinya masuk akal seperti hal lain di Kotlin.
SMBiggs

@SMBiggs mungkin terlalu banyak jawaban yang mirip, saya hanya menebak-nebak karena ini milik saya haha
Renetik

0

setText (String), jadi Anda harus setText string Anda ke editText, jadi dalam kasus Anda adalah: nametxt.setText (name)



-5

Coba gunakan nametxt.post: nametxt.post ({nametxt.setText ("teks Anda")})

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.