Вопрос:
Я пытаюсь установить текст в EditText, но он говорит:
Type mismatch. Required: Editable Found: String
Мой код выглядит следующим образом:
String name = «Paramjeet» val nametxt = findViewById (R.id.nametxt) as EditText nametxt.text = name
Не говорите использовать setText, потому что я использую kotlin, а не Java.
Лучший ответ:
Используйте setText(String), так как editText.text ожидает Editable, а не String.
Ответ №1
Используйте setText(String) поскольку EditText.text требует editable в первом месте, а не String
ЗАЧЕМ?
Хорошее объяснение Майкла дано по этой ссылке. Посетите эту ссылку для получения более подробной информации
При генерации синтетического свойства пары Java getter/setter Kotlin сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если будет представлен только сеттер.
Когда сеттер входит в игру, создание собственности становится более сложным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и/или сеттер могут быть переопределены в подклассе.
Ответ №2
Если вы хотите использовать getter .text из принципа, используйте:
nametxt.text = Editable.Factory.getInstance().newEditable(name) Ответ №3
Здесь есть несколько рабочих ответов, но если вы все еще хотите использовать формат собственности и ваш код выглядит чистым, вы можете написать расширение:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Затем вы можете использовать его как таковой:
mEditText.text = myString.toEditable() Ответ №4
Или вы можете использовать свойство расширения:
var EditText.value get() = this.text.toString() set(value) { this.setText(value) }
и используйте .value= вместо .text=
Ответ №5
Методы, которые следуют соглашениям 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)
Ответ №6editText.setText(«Your text here») Ответ №7var text = «Hello World» editText.text = text Ответ №8
У меня была та же проблема в моих проектах, я привожу вам пример, который показывает, как получать и задавать данные в макетах с помощью 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») } Ответ №9
setText (String), поэтому вы должны установить текст вашей строки для editText, поэтому в вашем случае это: nametxt.setText(name)
Ответ №10
Посмотрите на API EditText:
void setText (CharSequence text, TextView.BufferType type)
Editable getText ()
Ссылка: https://developer.android.com/reference/android/widget/EditText.html
Ответ №11
Попробуйте использовать nametxt.post: nametxt.post({nametxt.setText( “ваш текст” )})