Editable to string kotlin

Как работает синтаксис доступа к свойствам 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 сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если присутствует только сеттер.

Читайте также:  Javascript div 100 height

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

В вашем случае класс 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: $") > 
  • 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

Источник

Оцените статью