Setting text in EditText Kotlin
AndroidKotlinAndroid EdittextAndroid Problem Overview
I am trying to set text in a EditText but it says:
Type mismatch.
Required: Editable
Found: String
My code is as follow:
String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name
Don't say to use setText
because I am using kotlin, not Java.
Android Solutions
Solution 1 - Android
Use setText(String)
, since editText.text
expects an Editable
, not a String
.
Solution 2 - Android
Use setText(String)
as EditText.text
requires an editable
at firstplace not String
WHY ?
Nice explanation by Michael given under this link. Do visit this link for more detail
When generating a synthetic property for a Java getter/setter pair Kotlin first looks for a getter. The getter is enough to create a synthetic property with a type of the getter. On the other hand the property will not be created if only a setter presents.
When a setter comes into play property creation becomes more difficult. The reason is that the getter and the setter may have different type. Moreover, the getter and/or the setter may be overridden in a subclass.
Solution 3 - Android
There are several working answers here, but if you still want to use the property format and have your code look clean, you could write an extension:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
You can then use it as such:
mEditText.text = myString.toEditable()
Solution 4 - Android
If you want to use getter .text
from principle, use:
nametxt.text = Editable.Factory.getInstance().newEditable(name)
Solution 5 - Android
Simple Solution
Just use edittext.setText(yourdata
) instead of edittext.text
because the EditText is editable, the edittext.text
is used for TextView
For Example:
var name:String = "Muzammil"
edittext.setText(name)
That's it its work for me.
Solution 6 - Android
Or cast to TextView
but I believe this should be fixed on kotlin side for sure for convenience of developers !
(someEditText as TextView).text = "someTextValue"
Or with some extensions:
val EditText.asTextView: TextView get() = this as TextView
var EditText.value: CharSequence?
get() = asTextView.text
set(value) {
asTextView.text = value
}
You can write:
someEditText.asTextView.text = "someTextValue"
or
someEditText.value = "someTextValue"
But sadly you just cannot write simple someEditText.text = "someTextValue"
Solution 7 - Android
Or you can use an extension property:
var EditText.value
get() = this.text.toString()
set(value) {
this.setText(value)
}
and use .value=
instead of .text=
Solution 8 - Android
Methods that follow the Java conventions for getters and setters (no-argument methods with names starting with get and single-argument methods with names starting with set) are represented as properties in Kotlin. But, While generating a property for a Java getter/setter pair Kotlin at first looks for a getter. The getter is enough to infer the type of property from the type of the getter. On the other hand, the property will not be created if only a setter is present( because Kotlin does not support set-only properties at this time ) .
When a setter comes into play, property generation process becomes a bit ambiguous. The reason is that the getter and the setter may have different type. Moreover, the getter and/or the setter may be overridden in a subclass , which exactly is the case of EditText in android.
In above case the Android TextView class contains a getter
CharSequence getText()
and a setter void
setText(CharSequence)
If I had a variable of type TextView my code would have worked fine. But I used EditText class which contains an overridden getter
Editable getText()
which means that you can get an Editable for an EditText and set an Editable to an EditText. Therefore, Kotlin reasonably creates a synthetic property text of type Editable. As String class is not Editable, that’s why I cannot assign a String instance to the text property of the EditText class.
It Seems like JetBrains forgot to specify the dominant role of getter methods while generating kotlin properties for Java getter and setter methods. Anyways, I have submitted pull request to Jet brains kotlin website through github.
I have detailed above problem in this medium post too How Does Kotlin Generate Property from Java Getters and Setters (Undocumented by Jetbrains)
Solution 9 - Android
I had the same issue in my projects, I give you an example that shows how to retrieve and set data in the layouts using Kotlin:
there is one button save_button
and two text edit field edit_name
and 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")
}
Solution 10 - Android
Use like this:
edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
Solution 11 - Android
setText(String), so you must setText your string to editText, so in your case is : nametxt.setText(name)
Solution 12 - Android
val editable = Editable.Factory.getInstance().newEditable(savedString)
editText.text = editable
Solution 13 - Android
Look at the API of EditText:
void setText (CharSequence text, TextView.BufferType type)
Editable getText ()
Link: https://developer.android.com/reference/android/widget/EditText.html
Solution 14 - Android
Try using nametxt.post: nametxt.post({nametxt.setText("your text")})