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

Type mismatch. 
Required: Editable 
Found: String

Мой код следующий:

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

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

Ответы (14)

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

Посмотрите на API EditText:

void setText (текст CharSequence, тип TextView.BufferType)

Редактируемый getText ()

Ссылка: https://developer.android.com/reference/android/widget/EditText.html

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

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

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

CharSequence getText() 

и сеттер void

setText(CharSequence)

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

Editable getText()

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

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

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

val editable = Editable.Factory.getInstance (). NewEditable (savedString)

editText.text = редактируемый

Простое решение

Просто используйте edittext.setText (yourdata) вместо edittext.text, потому что EditText можно редактировать, edittext.textиспользуется для TextView

Например:

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

Это его работа для меня.

Используйте так:

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

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

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

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

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

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

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

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

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

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

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

mEditText.text = myString.toEditable()

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

ПОЧЕМУ?

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

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

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

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

Или преобразовать в 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"

Но, к сожалению, вы просто не можете написать simple someEditText.text = "someTextValue"

2022 WebDevInsider