Установка текста в EditText Kotlin

Я пытаюсь установить текст в EditText, но он говорит:

Type mismatch. 
Required: Editable 
Found: String

Мой код выглядит следующим образом:

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

Не говорите использовать setText, потому что я использую kotlin, а не Java.

Ответы

Ответ 1

Используйте setText(String), так как editText.text ожидает Editable, а не String.

Ответ 2

Используйте setText(String) поскольку EditText.text требует editable в первом месте, а не String

ЗАЧЕМ?

Хорошее объяснение Майкла дано по этой ссылке. Посетите эту ссылку для получения более подробной информации

При генерации синтетического свойства пары Java getter/setter Kotlin сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если будет представлен только сеттер.

Когда сеттер входит в игру, создание собственности становится более сложным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и/или сеттер могут быть переопределены в подклассе.

Ответ 3

Если вы хотите использовать getter .text из принципа, используйте:

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

Ответ 4

Здесь есть несколько рабочих ответов, но если вы все еще хотите использовать формат собственности и ваш код выглядит чистым, вы можете написать расширение:

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

Затем вы можете использовать его как таковой:

mEditText.text = myString.toEditable()

Ответ 5

Или вы можете использовать свойство расширения:

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

и используйте .value= вместо .text=

Ответ 6

Методы, которые следуют соглашениям Java для геттеров и сеттеров (методы без аргументов с именами, начинающимися с методов get и single-argument с именами, начинающимися с набора) представлены в качестве свойств в Kotlin. Но, генерируя свойство для пары get/set Java, Kotlin сначала ищет геттер. Геттера достаточно, чтобы вывести тип свойства из типа получателя. С другой стороны, свойство не будет создано, если присутствует только сеттер (поскольку в это время Kotlin не поддерживает свойства set-only).

Когда сеттер входит в игру, процесс генерации собственности становится немного неоднозначным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и/или сеттер могут быть переопределены в подклассе, что в точности относится к EditText в android.

В приведенном выше случае класс Android TextView содержит геттер

CharSequence getText() 

и недействительным сеттера

setText(CharSequence)

Если бы у меня была переменная типа TextView, мой код работал бы нормально. Но я использовал класс EditText, который содержит переопределенный getter

Editable getText()

это означает, что вы можете получить редактируемый для EditText и установить Editable для EditText. Поэтому Котлин разумно создает синтетический текст свойства типа Editable. Поскольку класс String не редактируется, вот почему я не могу назначить экземпляр String для свойства text класса EditText.

Похоже, что JetBrains забыл указать доминирующую роль методов getter при генерации свойств kotlin для методов getter и setter для Java. В любом случае, я отправил запрос тянуть на сайт Jet мозгов kotlin через github.

Я также подробно описал проблему на этом среднесрочном сообщении. Как Kotlin генерирует свойство из Java Getters и Setters (недокументированное Jetbrains)

Ответ 7

editText.setText("Your text here")

Ответ 8

var text = "Hello World"   
editText.text = text

Ответ 9

У меня была та же проблема в моих проектах, я привожу вам пример, который показывает, как получать и задавать данные в макетах с помощью 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 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")
                }

Ответ 10

setText (String), поэтому вы должны установить текст вашей строки для editText, поэтому в вашем случае это: nametxt.setText(name)

Ответ 12

Попробуйте использовать nametxt.post: nametxt.post({nametxt.setText( "ваш текст" )})