285

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.

4
  • Possible duplicate of How does Kotlin property access syntax work for Java classes? Commented Jun 12, 2017 at 7:46
  • Aside: You don't need findViewById if you use the Kotlin Android extensions (shipped with Android Studio). You should just be able to call nexttxt.setText(name) without any find or casting. Commented Jan 3, 2018 at 13:12
  • 3
    This is not a Kotlin code as you are claiming @Singh Commented Jul 9, 2019 at 8:05
  • @VladyslavMatviienko: Yeah, we should remove this thread because everyone who can't set text in their kotlin EditText would immediately think to search for "kotlin property access syntax for java classes." It's the first thing that popped up in my head when I saw that compiler error. Commented Aug 10, 2020 at 14:48

15 Answers 15

541

Use setText(String), since editText.text expects an Editable, not a String.

Sign up to request clarification or add additional context in comments.

7 Comments

nither EditText get focus after setText() nor softInput keyboard open
But why? It sounds so similar!!
So much for Kotlin's desire to avoid java's property use syntax! Yup, setter method thrown right out the window!
@SMBiggs so much for java fanboying over Kotlin's ease of, well, everything.
@SMBiggs haha maybe you did, cuz I'm deeply in love with Kotlin. Good day mate!
|
54

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.

Comments

47

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

2 Comments

Extension approach is better than using old java setText.
Better do extension for edit text : fun EditText.setEditableText(text:String){ this.text = Editable.Factory.getInstance().newEditable(text) }
28

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.

1 Comment

Slightly better explanation than nhaarman's answer.
26

If you want to use getter .text from principle, use:

nametxt.text = Editable.Factory.getInstance().newEditable(name)

Comments

10

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"

4 Comments

Why was this down-voted? Seems as perfectly reasonable as anything else in Kotlin.
@SMBiggs maybe too much similar answers, I am just guessing as this was mine haha
OR use someEditText.setText("new value") instead of setting the text property.
Maybe because android.widget.EditText has a .text property but does not have .asTextView nor .value properties?
8

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=

Comments

3

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)

Comments

2

Use like this:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))

Comments

2
val editable = Editable.Factory.getInstance().newEditable(savedString)

editText.text = editable

Comments

1

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")
                }

Comments

0

setText(String), so you must setText your string to editText, so in your case is : nametxt.setText(name)

Comments

-3
var name:String = "hello world"

textview.text = name

(or)

var editText:String = "hello world"

textview.setText(name)

2 Comments

Please, use code blocks for share your code
Please don't post code-only answers. The main audience, future readers, will be grateful to see explained why this answers the question instead of having to infer it from the code. Also, since this is an old, well answered question, please explain how it complements all other answers.
-4

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

Comments

-6

Try using nametxt.post: nametxt.post({nametxt.setText("your text")})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.