Налаштування тексту в 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.