Как работает синтаксис доступа к свойствам Kotlin для классов Java (т.е. EditText setText)?
Я пытаюсь переключить свой проект Android на Kotlin. У меня есть EditText (подкласс TextView ), для которого я хочу установить подсказку и текст программно. Подсказка работает как положено. Для текста, однако, я получаю исключение несоответствия типов, если я пытаюсь сделать это, используя синтаксис Kotlin:
val test = EditText(context) test.setHint("hint") // Lint message: "Use property access syntax" test.hint = "hint" // ok test.setText("text") // ok (no lint message) test.text = "text" // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected
Если мы посмотрим на объявление, мы найдем идентичные подписи, унаследованные от TextView :
public final void setHint(CharSequence hint) public final void setText(CharSequence text)
У меня сложилось впечатление, что xy = z было сокращением для x.setY(z) но, очевидно, это впечатление было неправильным. setText() рассматривается как обычный метод, а не как установщик, но какая разница между этими двумя методами, которая заставляет компилятор вести себя по-разному? Единственное, о чем я могу подумать, это то, что TextView имеет свойство mHint но я не думаю, что это может иметь место.
Еще одна вещь, которую я не совсем понимаю: откуда взялся android.text.Editable ? Нет соответствующего метода setText(Editable) и нет открытого поля этого типа.
При генерации синтетического свойства пары Java getter/setter Kotlin сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если присутствует только сеттер.
При запуске сеттера создание свойства становится более сложным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и/или сеттер могут быть переопределены в подклассе.
В вашем случае класс TextView содержит getter CharSequence getText() и setter void setText(CharSequence) . Если у вас есть переменная типа TextView , ваш код будет работать нормально. Но у вас есть переменная типа EditText . И класс EditText содержит переопределенный getter Editable getText() , что означает, что вы можете получить Editable для EditText и установить Editable в EditText . Поэтому Котлин разумно создает синтетическое свойство text типа Editable . Класс String не является Editable , поэтому вы не можете назначить экземпляр String для свойства text класса EditText .
Чтобы избежать несоответствия типов, вы можете использовать внутренний класс Factory класса Editable.
Итак, теперь вы можете сделать что-то вроде:
textview.text = Editable.Factory.getInstance().newEditable("your text")
В качестве альтернативы вы можете написать расширение:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Затем вы можете использовать его как таковой:
mEditText.text = myString.toEditable()
android.text.Editable происходит от getText() . Мне кажется, что разрешение obj.text = value в Котлине – двухэтапный процесс.
- Компилятор пытается найти свойство text или метод Java getText , из которого он выводит тип свойства
- Для свойства inferred type компилятор пытается найти соответствующий набор свойств или метод Java setText(PropertyType value)
Так как в 1. выведенном типе Editable ошибка editText.text = «value» не выполняется с ошибкой Type mismatch .
Установка текста в EditText Kotlin
Я пытаюсь установить текст в 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 .
Используйте setText(String) , поскольку editText.text ожидает Editable , а не String . пример: — editText.setText(String)
Или используйте это editText.text = Editable.Factory.getInstance().newEditable(String)
У меня была та же проблема в моих проектах, я привожу вам пример, который показывает, как получать и задавать данные в макетах с помощью 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") >
Или приведите к TextView , но я считаю, что это должно быть исправлено на стороне kotlin для удобства разработчиков!
(someEditText as TextView).text = "someTextValue"
Или с некоторыми расширениями:
val EditText.asTextView: TextView get() = this as TextView var EditText.value: CharSequence? get() = asTextView.text set(value)
someEditText.asTextView.text = "someTextValue"
someEditText.value = "someTextValue"
Но, к сожалению, вы просто не можете написать просто someEditText.text = «someTextValue»
Посмотрите на API EditText:
void setText (CharSequence text, TextView.BufferType type)
Или вы можете использовать свойство extension:
var EditText.value get() = this.text.toString() set(value)
И используйте .value= вместо .text=
Если вы хотите использовать getter .text из принципа, используйте:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
Простое решение
Просто используйте edittext.setText(yourdata ) вместо edittext.text , поскольку EditText доступен для редактирования, edittext.text используется для TextView
var name:String = "Muzammil" edittext.setText(name)
Вот и все его работа для меня.
Использование setText(String) , поскольку EditText.text требует editable , а не String
Хорошее объяснение Майкла в разделе эта ссылка. Посетите эту ссылку для более подробной информации
При генерации синтетического свойства для пары «геттер / установщик» Java Kotlin сначала ищет геттер. Получателя достаточно, чтобы создать синтетическое свойство с типом получателя. С другой стороны, свойство не будет создано, если присутствует только установщик.
Когда сеттер входит в игру, создание свойств становится более сложным. Причина в том, что геттер и сеттер могут иметь разные типы. Кроме того, получатель и / или установщик могут быть переопределены в подклассе.
Попробуйте использовать nametxt.post: nametxt.post ()
edtTitle.setText(intent.getStringExtra(EXTRA_TITLE)) edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
Методы, которые следуют соглашениям Java для методов получения и установки (методы без аргументов с именами, начинающимися с get, и методы с одним аргументом с именами, начинающимися с set), представлены как свойства в Kotlin. Но, генерируя свойство для пары геттер / сеттер Java, Kotlin сначала ищет геттер. Получателя достаточно, чтобы вывести тип свойства из типа получателя. С другой стороны, свойство не будет создано, если присутствует только установщик (потому что Kotlin не поддерживает свойства только для набора в настоящее время).
Когда сеттер вступает в игру, процесс генерации свойств становится немного неоднозначным. Причина в том, что геттер и сеттер могут иметь разные типы. Более того, геттер и / или сеттер могут быть переопределены в подклассе, что в точности относится к EditText в Android.
В вышеприведенном случае класс Android TextView содержит геттер
Если бы у меня была переменная типа TextView, мой код работал бы нормально. Но я использовал класс EditText, который содержит переопределенный метод получения
Это означает, что вы можете получить Editable для EditText и установить Editable для EditText. Поэтому Kotlin разумно создает синтетический текст свойства типа Editable. Так как класс String не является редактируемым, поэтому я не могу назначить экземпляр String свойству text класса EditText.
Похоже, что JetBrains забыл указать доминирующую роль методов-получателей при создании свойств kotlin для методов-получателей и сеттеров Java. В любом случае, я отправил запрос на загрузку на сайт Jet Brains kotlin через github.
Здесь есть несколько рабочих ответов, но если вы все еще хотите использовать формат свойств и ваш код выглядит чистым, вы можете написать расширение:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Затем вы можете использовать его как таковой:
mEditText.text = myString.toEditable()
SetText (String), поэтому вы должны установить текст вашей строки в editText, поэтому в вашем случае это: nametxt.setText (name)
[Solved]-Kotlin edittext editable to string returns nothing-kotlin
Here, variables get empty values because there is no text initially. After putting something you are clicking on button so its showing empty values. And $ by this you are getting values from edittext field.
You just need to put assignment lines inside onClickListener.
findViewById(R.id.button_login).setOnClickListener < val userInput: String = edittext_username.text.toString() val passInput = "$" //put above two line here Log.i(TAG, "inputTestText is null? $") Log.i(TAG, "inputTestTextToString: $inputTestTextToString") Log.i(TAG, "A user: $userInput password: $passInput") Log.i(TAG, "B user: $ password: $") >
Related Query
- Kotlin edittext editable to string returns nothing
- Convert String obtained from edittext to Integer in Kotlin language
- Convert String to JsonObject in kotlin returns null
- Convert EditText (type phone) to String in Kotlin
- Kotlin Gson toJson returns double quoted string
- Kotlin DialogFragment editText editable always null
- Kotlin vert.x parsing a JSON String to a Data class using gson always returns null
- Convert EditText Array to String Array — Kotlin Android
- Kotlin — String from Edittext in DialogFragment don’t save in data class
- Format in Kotlin string templates
- Setting text in EditText Kotlin
- Kotlin — How to correctly concatenate a String
- Kotlin — Void vs. Unit vs. Nothing
- Kotlin get type as string
- Idiomatic way to generate a random alphanumeric string in Kotlin
- Define multiple variables at once in Kotlin (e.g Java : String x,y,z;)
- Why do I have to return Unit.INSTANCE when implementing in Java a Kotlin function that returns a Unit?
- Get string extra from activity Kotlin
- kotlin ‘onCreate’ overrides nothing
- Remove character from string in Kotlin
- Checking if string is empty in Kotlin
- Best Way to Convert ArrayList to String in Kotlin
- How to use Kotlin when to find if a string is numeric?
- Escape $ in a Kotlin String
- Compare String Kotlin
- How to print all elements of String array in Kotlin in a single line?
- How does Kotlin property access syntax work for Java classes (i.e. EditText setText)?
- Kotlin Android / Java String DateTime Format, API21
- Split space from string not working in Kotlin
- Whats the best way in kotlin for an null object’s toString() method to return an empty string instead of «null»
More Query from same tag
- Is there any difference between `runningFold` and `scan` methods in the Kotlin collections library?
- How to get the inserted row in Kotlin Exposed?
- Filter json response accordingly to time stamp in kotlin
- Android Sqlite Database copyDatabase function Paths
- How do I hide the status bar in my Android 11 app?
- android.content.Context.getSharedPreferences(java.lang.String, int)’ on a null object reference id DBhandler
- Is there any way to launch appropriate activity of my app when appropriate NFC Tag is scanned?
- Retrofit query parameters adding apiKey
- Odd behavior with kotlin’s readLine function
- Retrofit 2 Json Response Body
- Running two Countdown Timers Sequentially
- Formatting the Nested JSON response from retrofit API in MVVM Architecture — Kotlin
- How does erasure work in Kotlin?
- Kotlin set variable and call method in main class from companion object
- How to fix Cannot call this method while RecyclerView is computing a layout or scrolling
- Error when trying to add downloadUri to firestore document. «Could not serialize object. Exceeded maximum depth of 500»
- How to pass a class to a function in Kotlin
- How do I map non-null elements without an assertion in Kotlin?
- Display objects of a list randomly but only once per object in Kotlin?
- How to show Text view with animation by 3 dot one by one like progress bar
- How do I detect if the app is written in Kotlin, given an APK file?
- kotlinx-coroutines-test. withContext in liveData doesn’t switch back to the previous context after its finish
- Floating action button(FAB) in MotionLayout, .show() doesn’t work, .hide() work incorrect
- How can i bind property values using Kotlin?
- Null Pointer Exception Kotlin app
- Kotlin and Java PECS
- Identify Custom Class in Kotlin
- Async working, but getting unresolved reference for await
- I need to know why? and If I change this line to «println(name+two)» error solved?
- Getting a unsupported exception when trying to AddAll to a MutableList