Ответ 1
Используйте setText(String)
, так как editText.text
ожидает Editable
, а не String
.
Я пытаюсь установить текст в 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
.
Используйте setText(String)
поскольку EditText.text
требует editable
в первом месте, а не String
ЗАЧЕМ?
Хорошее объяснение Майкла дано по этой ссылке. Посетите эту ссылку для получения более подробной информации
При генерации синтетического свойства пары Java getter/setter Kotlin сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если будет представлен только сеттер.
Когда сеттер входит в игру, создание собственности становится более сложным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и/или сеттер могут быть переопределены в подклассе.
Если вы хотите использовать getter .text
из принципа, используйте:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
Здесь есть несколько рабочих ответов, но если вы все еще хотите использовать формат собственности и ваш код выглядит чистым, вы можете написать расширение:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Затем вы можете использовать его как таковой:
mEditText.text = myString.toEditable()
Или вы можете использовать свойство расширения:
var EditText.value
get() = this.text.toString()
set(value) {
this.setText(value)
}
и используйте .value=
вместо .text=
Методы, которые следуют соглашениям 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)
editText.setText("Your text here")
var text = "Hello World"
editText.text = text
У меня была та же проблема в моих проектах, я привожу вам пример, который показывает, как получать и задавать данные в макетах с помощью 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")
}
setText (String), поэтому вы должны установить текст вашей строки для editText, поэтому в вашем случае это: nametxt.setText(name)
Посмотрите на API EditText:
void setText (CharSequence text, TextView.BufferType type)
Editable getText ()
Ссылка: https://developer.android.com/reference/android/widget/EditText.html
Попробуйте использовать nametxt.post: nametxt.post({nametxt.setText( "ваш текст" )})