Cài đặt văn bản trong EditText Kotlin


147

Tôi đang cố gắng đặt văn bản trong EditText nhưng nó nói:

Type mismatch. 
Required: Editable 
Found: String

Mã của tôi là như sau:

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

Đừng nói sử dụng setTextvì tôi đang sử dụng kotlin, không phải Java.



Ngoài ra: Bạn không cần findViewById nếu bạn sử dụng các tiện ích mở rộng Android của Kotlin (được cung cấp cùng với Android Studio). Bạn chỉ có thể gọi nexttxt.setText(name)mà không cần tìm hoặc đúc.
AjahnCharles

Đây không phải là mã Kotlin như bạn đang yêu cầu @Singh
Sazzad Hissain Khan

Câu trả lời:


310

Sử dụng setText(String), vì editText.textmong đợi một Editable, không phải a String.


Không phải EditText sẽ lấy nét sau khi setText () cũng như bàn phím softInput mở
Saurabh Bhandari

Nhưng tại sao? Nghe có vẻ rất giống !!
Malwinder Singh

36

Sử dụng setText(String)như EditText.textyêu cầu đầu editabletiên không phải là Chuỗi

TẠI SAO ?

Giải thích tốt đẹp của Michael được đưa ra theo liên kết này . Hãy truy cập liên kết này để biết thêm chi tiết

Khi tạo một thuộc tính tổng hợp cho một cặp getter / setter Java, trước tiên, Kotlin tìm kiếm một getter. Các getter là đủ để tạo ra một tài sản tổng hợp với một loại getter. Mặt khác, tài sản sẽ không được tạo nếu chỉ có một setter trình bày.

Khi một setter đi vào việc tạo tài sản chơi trở nên khó khăn hơn. Lý do là getter và setter có thể có loại khác nhau. Hơn nữa, getter và / hoặc setter có thể bị ghi đè trong một lớp con.


22

Có một số câu trả lời hoạt động ở đây, nhưng nếu bạn vẫn muốn sử dụng định dạng thuộc tính và để mã của bạn trông sạch sẽ, bạn có thể viết một phần mở rộng:

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

Sau đó bạn có thể sử dụng nó như vậy:

mEditText.text = myString.toEditable()

1
Cách tiếp cận mở rộng tốt hơn so với sử dụng java setText cũ.
Piotr Badura

18

Nếu bạn muốn sử dụng getter .texttừ nguyên tắc, hãy sử dụng:

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

3

Hoặc bạn có thể sử dụng thuộc tính mở rộng:

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

và sử dụng .value=thay vì.text=


2

Các phương thức tuân theo các quy ước Java cho getters và setters (phương thức không có đối số với tên bắt đầu bằng phương thức get và đối số đơn có tên bắt đầu bằng tập hợp) được biểu diễn dưới dạng các thuộc tính trong Kotlin. Nhưng, trong khi tạo một thuộc tính cho một cặp getter / setter Java, Kotlin lúc đầu tìm kiếm một getter. Các getter là đủ để suy ra các loại tài sản từ các loại getter. Mặt khác, thuộc tính sẽ không được tạo nếu chỉ có trình thiết lập (vì Kotlin không hỗ trợ các thuộc tính chỉ thiết lập tại thời điểm này).

Khi một setter đi vào hoạt động, quá trình tạo thuộc tính trở nên hơi mơ hồ. Lý do là getter và setter có thể có loại khác nhau. Hơn nữa, getter và / hoặc setter có thể bị ghi đè trong một lớp con, đó chính xác là trường hợp của EditText trong Android.

Trong trường hợp trên, lớp TextView của Android chứa một getter

CharSequence getText() 

và một khoảng trống setter

setText(CharSequence)

Nếu tôi có một biến kiểu TextView, mã của tôi sẽ hoạt động tốt. Nhưng tôi đã sử dụng lớp EditText có chứa một getter bị ghi đè

Editable getText()

điều đó có nghĩa là bạn có thể có được Chỉnh sửa cho Chỉnh sửa và đặt Chỉnh sửa thành Chỉnh sửa. Do đó, Kotlin hợp lý tạo ra một văn bản thuộc tính tổng hợp có thể chỉnh sửa. Vì lớp String không thể chỉnh sửa, đó là lý do tại sao tôi không thể gán một thể hiện String cho thuộc tính văn bản của lớp EditText.

Có vẻ như JetBrains đã quên chỉ định vai trò chi phối của các phương thức getter trong khi tạo các thuộc tính kotlin cho các phương thức getter và setter Java. Dù sao, tôi đã gửi yêu cầu kéo tới trang web Jet brains kotlin thông qua github.

Tôi cũng đã nêu chi tiết vấn đề ở bài đăng trung bình này. Làm thế nào mà Kotlin tạo tài sản từ Java Getters và Setters (Không có tài liệu của Jetbrains)


0

Tôi gặp vấn đề tương tự trong các dự án của mình, tôi cho bạn một ví dụ cho thấy cách lấy và đặt dữ liệu trong bố cục bằng cách sử dụng Kotlin: có một nút save_buttonvà hai trường chỉnh sửa văn bản edit_nameedit_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

Giải pháp đơn giản

Chỉ sử dụng edittext.setText(yourdata) thay edittext.textvì vì EditText có thể chỉnh sửa, edittext.textđược sử dụng choTextView

Ví dụ:

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

Đó là công việc của tôi.


0

Sử dụng như thế này:

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

-1

setText (Chuỗi), vì vậy bạn phải đặt chuỗi của bạn thành chỉnh sửa, vì vậy trong trường hợp của bạn là: nametxt.setText (name)


-2

Hoặc diễn viên đến TextViewnhưng tôi tin rằng điều này cần được cố định trên mặt Kotlin chắc chắn cho sự tiện lợi của các nhà phát triển!

(someEditText as TextView).text = "someTextValue"

Hoặc với một số tiện ích mở rộng:

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

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

Bạn có thể viết:

someEditText.asTextView.text = "someTextValue"

hoặc là

someEditText.value = "someTextValue"

Nhưng buồn thay, bạn không thể viết đơn giảnsomeEditText.text = "someTextValue"



-6

Hãy thử sử dụng nametxt.post: nametxt.post ({nametxt.setText ("văn bản của bạn")})

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.