Настройка текста в EditText Kotlin


148

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

Type mismatch. 
Required: Editable 
Found: String

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

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

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



Кроме того: вам не нужен findViewById, если вы используете расширения Kotlin для Android (поставляются с Android Studio). Вы должны просто иметь возможность звонить nexttxt.setText(name)без каких-либо находок или кастинга.
AjahnCharles

Это не кодлин Kotlin, как вы утверждаете @Singh
Саззад Хиссейн Хан

Ответы:



36

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

ЗАЧЕМ ?

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

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

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


22

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

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

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

mEditText.text = myString.toEditable()

1
Подход расширения лучше, чем использование старого Java SetText.
Петр Бадура

18

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

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

3

Или вы можете использовать свойство extension:

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

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


2

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

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

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

CharSequence getText() 

и сеттер пустоты

setText(CharSequence)

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

Editable getText()

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

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

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


0

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

0

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

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

Например:

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

Вот и все его работа для меня.


0

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

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


-2

Или приведение к, 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"

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.