การตั้งค่าข้อความใน EditText Kotlin


166

ฉันพยายามตั้งค่าข้อความใน EditText แต่มันบอกว่า:

Type mismatch. 
Required: Editable 
Found: String

รหัสของฉันมีดังนี้:

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

อย่าบอกว่าใช้setTextเพราะฉันใช้ kotlin ไม่ใช่ Java



นอกเหนือ: คุณไม่จำเป็นต้องใช้ findViewById หากคุณใช้ส่วนขยายของ Kotlin Android (มาพร้อมกับ Android Studio) คุณควรจะโทรได้nexttxt.setText(name)โดยไม่ต้องค้นหาหรือแคสต์
AjahnCharles

นี่ไม่ใช่รหัส Kotlin ตามที่คุณอ้าง @Singh
Sazzad Hissain Khan

@VladyslavMatviienko: ใช่เราควรลบเธรดนี้เพราะทุกคนที่ไม่สามารถตั้งค่าข้อความใน kotlin EditText ของพวกเขาจะคิดค้นหา "kotlin property access syntax for java class" ทันที มันเป็นสิ่งแรกที่ผุดขึ้นมาในหัวของฉันเมื่อฉันเห็นข้อผิดพลาดของคอมไพเลอร์
SMBiggs

คำตอบ:


345

ใช้setText(String)เนื่องจากeditText.textคาดว่าจะEditableไม่ใช่String.


ทั้ง EditText ไม่ได้รับโฟกัสหลังจาก setText () หรือคีย์บอร์ด softInput เปิด
Saurabh Bhandari

แต่ทำไม? ฟังดูคล้ายกันมาก !!
Malwinder Singh

มากสำหรับความปรารถนาของ Kotlin ที่จะหลีกเลี่ยงไวยากรณ์การใช้คุณสมบัติของ java! ใช่วิธี setter โยนออกไปนอกหน้าต่าง!
SMBiggs

ขอบคุณสำหรับคำตอบ. สิ่งนี้ช่วยฉันได้
thesamoanppprogrammer

38

ใช้setText(String)ตามความEditText.textต้องการeditableในตอนแรกไม่ใช่ String

ทำไม?

คำอธิบายที่ดีโดยMichaelภายใต้ลิงค์นี้ เยี่ยมชมลิงค์นี้เพื่อดูรายละเอียดเพิ่มเติม

เมื่อสร้างคุณสมบัติสังเคราะห์สำหรับคู่ Java getter / setter Kotlin ให้มองหา getter ก่อน getter เพียงพอที่จะสร้างคุณสมบัติสังเคราะห์ด้วยประเภทของ getter ในทางกลับกันคุณสมบัติจะไม่ถูกสร้างขึ้นหากมีเพียงเซ็ตเตอร์เท่านั้นที่นำเสนอ

เมื่อเซ็ตเตอร์เข้ามาเล่นการสร้างคุณสมบัติจะยากขึ้น เหตุผลก็คือ getter และ setter อาจมีประเภทที่แตกต่างกัน ยิ่งไปกว่านั้น getter และ / หรือ setter อาจถูกแทนที่ในคลาสย่อย


29

มีคำตอบที่ใช้ได้หลายประการที่นี่ แต่ถ้าคุณยังต้องการใช้รูปแบบคุณสมบัติและทำให้โค้ดของคุณดูสะอาดคุณสามารถเขียนส่วนขยาย:

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

จากนั้นคุณสามารถใช้งานได้ดังนี้:

mEditText.text = myString.toEditable()

1
แนวทางการขยายดีกว่าการใช้ java setText แบบเก่า
Piotr Badura

1
ส่วนขยายที่ดีกว่าสำหรับแก้ไขข้อความ: fun EditText.setEditableText (text: String) {this.text = Editable.Factory.getInstance (). newEditable (text)}
Evgeniy Pavlov


5

หรือคุณสามารถใช้คุณสมบัติส่วนขยาย:

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

และใช้.value=แทน.text=


3

เมธอดที่เป็นไปตามอนุสัญญา Java สำหรับ getters และ setters (เมธอดไม่มีอาร์กิวเมนต์ที่มีชื่อขึ้นต้นด้วยเมธอด get และ single-argument ที่มีชื่อขึ้นต้นด้วย set) จะแสดงเป็นคุณสมบัติใน Kotlin แต่ในขณะที่สร้างคุณสมบัติสำหรับคู่ Java getter / setter Kotlin ในตอนแรกมองหา getter getter เพียงพอที่จะอนุมานประเภทของคุณสมบัติจากประเภทของ getter ในทางกลับกันคุณสมบัติจะไม่ถูกสร้างขึ้นหากมีเพียง setter เท่านั้น (เนื่องจาก Kotlin ไม่สนับสนุนคุณสมบัติ set-only ในขณะนี้)

เมื่อ setter เข้ามามีบทบาทกระบวนการสร้างคุณสมบัติจะค่อนข้างคลุมเครือ เหตุผลก็คือ getter และ setter อาจมีประเภทที่แตกต่างกัน ยิ่งไปกว่านั้น getter และ / หรือ setter อาจถูกแทนที่ในคลาสย่อยซึ่งเป็นกรณีของ EditText ใน Android

ในกรณีข้างต้นคลาส Android TextView มี getter

CharSequence getText() 

และเซตเตอร์เป็นโมฆะ

setText(CharSequence)

หากฉันมีตัวแปรประเภท TextView รหัสของฉันจะทำงานได้ดี แต่ฉันใช้คลาส EditText ซึ่งมี getter ที่ถูกแทนที่

Editable getText()

ซึ่งหมายความว่าคุณจะได้รับ Editable สำหรับ EditText และตั้งค่า Editable เป็น EditText ดังนั้น Kotlin จึงสร้างข้อความคุณสมบัติสังเคราะห์ประเภทแก้ไขได้อย่างสมเหตุสมผล เนื่องจากคลาส String ไม่สามารถแก้ไขได้นั่นเป็นเหตุผลที่ฉันไม่สามารถกำหนดอินสแตนซ์ String ให้กับคุณสมบัติข้อความของคลาส EditText

ดูเหมือนว่า JetBrains ลืมระบุบทบาทที่โดดเด่นของเมธอด getter ในขณะที่สร้างคุณสมบัติ kotlin สำหรับ Java getter และ setter method อย่างไรก็ตามฉันได้ส่งคำขอดึงไปยังเว็บไซต์ Jet brains kotlin ผ่าน github แล้ว

ฉันได้อธิบายปัญหาข้างต้นในโพสต์ขนาดกลางนี้ด้วยเช่นกันKotlin สร้างคุณสมบัติจาก Java Getters และ Setters (ไม่มีเอกสารโดย Jetbrains)


2

วิธีแก้ปัญหาง่ายๆ

เพียงแค่ใช้edittext.setText(yourdata) แทนedittext.textเนื่องจากEditTextสามารถแก้ไขได้edittext.textจึงใช้สำหรับTextView

ตัวอย่างเช่น:

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

นั่นเป็นผลสำหรับฉัน


1
คำอธิบายดีกว่าคำตอบของ nhaarman เล็กน้อย
SMBiggs

1

ฉันมีปัญหาเดียวกันในโครงการของฉันฉันให้ตัวอย่างที่แสดงวิธีดึงและตั้งค่าข้อมูลในเค้าโครงโดยใช้ Kotlin: มีปุ่มเดียวsave_buttonและช่องแก้ไขข้อความสองช่องedit_nameและ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

หรือส่งไปTextViewแต่ฉันเชื่อว่าสิ่งนี้ควรได้รับการแก้ไขในฝั่ง kotlin อย่างแน่นอนเพื่อความสะดวกของนักพัฒนา!

(someEditText as TextView).text = "someTextValue"

หรือมีส่วนขยายบางส่วน:

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

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

คุณสามารถเขียน:

someEditText.asTextView.text = "someTextValue"

หรือ

someEditText.value = "someTextValue"

แต่น่าเศร้าที่คุณไม่สามารถ เขียนธรรมดา ๆsomeEditText.text = "someTextValue"


เหตุใดจึงได้รับการโหวตลดลง ดูเหมือนจะสมเหตุสมผลอย่างสมบูรณ์แบบเช่นเดียวกับสิ่งอื่นใดใน Kotlin
SMBiggs

@SMBiggs บางทีคำตอบที่คล้ายกันมากเกินไปฉันแค่เดาว่านี่เป็นของฉันฮ่าฮ่า
Renetik

0

setText (String) ดังนั้นคุณต้อง setText สตริงของคุณเพื่อแก้ไขข้อความดังนั้นในกรณีของคุณคือ: nametxt.setText (ชื่อ)



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.