Налаштування тексту в EditText Kotlin


147

Я намагаюся встановити текст у 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, якщо ви використовуєте розширення Android від Kotlin (поставляються з Android Studio). Ви повинні просто мати можливість дзвонити nexttxt.setText(name)без жодної знахідки чи кастингу.
— AjahnCharles

Це не код Котліна, як ви заявляєте @Singh
— Sazzad Hissain Khan

Відповіді:


310

Використовуйте setText(String), оскільки editText.textочікує Editable, а не а String.


ні EditText отримати фокус після setText (), ні softInput клавіатури відкрито
— Saurabh Bhandari

Але чому? Це звучить так схоже !!
— Malwinder Singh

36

Використовуйте setText(String)як EditText.textпотрібне спочатку editableне String

ЧОМУ?

Nice пояснення по Майклу надається по цьому посиланню . Перейдіть за цим посиланням для більш детальної інформації

При генерації синтетичної властивості для пари Getter / setter Java Котлін спочатку шукає геттера. Гетеру достатньо для створення синтетичної властивості з типом геттера. З іншого боку, властивість не буде створена, якщо представлений лише сетер.

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


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

Або ви можете використовувати властивість розширення:

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

і використовувати .value=замість.text=


2

Методи, що слідують конвенціям Java для getters і setters (методи без аргументів з іменами, що починаються з get, і одноаргументні методи з іменами, що починаються з набору) представлені як властивості в Kotlin. Але, генеруючи властивість для пари Getter / setter Java, Котлін спочатку шукає геттера. Геттеру достатньо для виведення типу майна з типу геттера. З іншого боку, властивість не буде створено, якщо присутній лише сетер (оскільки Котлін на даний момент не підтримує властивості лише набору).

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

У наведеному випадку клас Android TextView містить геттер

CharSequence getText() 

і пустота сетера

setText(CharSequence)

Якби у мене була змінна типу TextView, мій код добре працював би. Але я використав клас EditText, який містить переосмислений геттер

Editable getText()

а це означає, що ви можете отримати редагований редактор для редагування та встановити для редагування редактор редагування. Тому Котлін обґрунтовано створює синтетичний текст властивості типу Editable. Оскільки клас String не піддається редагуванню, тому я не можу призначити екземпляр String текстовій властивості класу EditText.

Схоже, JetBrains забув вказати домінуючу роль методів getter, генеруючи kotlin властивості для методів Getter та setter Java. У будь-якому разі я подав запит на тягу на веб-сайт Jet brains kotlin через github.

Я детально описав вище проблему і в цій середній публікації Як Котлін генерує майно від Java Getters та Setters (Недокументований Jetbrains)


0

У мене був такий самий випуск у моїх проектах, я наводжу вам приклад, який показує, як отримати та встановити дані в макетів за допомогою Котліна: є одна кнопка 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але я вважаю , що це повинно бути зафіксовано на Котлін стороні напевно для зручності розробників!

(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.