【问题标题】:Setting text in EditText Kotlin在 EditText Kotlin 中设置文本
【发布时间】:2017-11-13 14:28:59
【问题描述】:

我正在尝试在 EditText 中设置文本,但它说:

Type mismatch. 
Required: Editable 
Found: String

我的代码如下:

String name = "Paramjeet"
val nametxt = findViewById (R.id.nametxt) as EditText
nametxt.text = name

不要说使用setText,因为我使用的是 kotlin,而不是 Java。

【问题讨论】:

  • 旁白:如果您使用 Kotlin Android 扩展(随 Android Studio 提供),则不需要 findViewById。您应该能够在没有任何查找或转换的情况下调用 nexttxt.setText(name)
  • 这不是 Kotlin 代码,因为您声称 @Singh
  • @VladyslavMatviienko:是的,我们应该删除这个帖子,因为无法在 kotlin EditText 中设置文本的每个人都会立即想到搜索“Java 类的 kotlin 属性访问语法”。当我看到编译器错误时,这是​​我脑海中突然出现的第一件事。

标签: android kotlin android-edittext


【解决方案1】:

使用setText(String),因为editText.text 需要Editable,而不是String

【讨论】:

  • 在 setText() 和 softInput 键盘打开后,EditText 都没有获得焦点
  • 但是为什么呢?听起来很像!
  • Kotlin 希望避免使用 java 的属性使用语法!是的,setter 方法直接抛出了窗口!
  • @SMBiggs 对 Kotlin 的易用性感到非常满意。
  • @SMBiggs 哈哈也许你做到了,因为我深深爱上了 Kotlin。晚安,伙计!
【解决方案2】:

setText(String) 用作EditText.text 需要editable 首先不是字符串

为什么?

Nice explanationMichaelthis link 下提供。请访问此链接了解更多详情

在为 Java getter/setter 对生成合成属性时,Kotlin 首先查找 getter。 getter 足以创建具有 getter 类型的合成属性。另一方面,如果只有 setter 存在,则不会创建该属性。

当 setter 出现时,属性创建变得更加困难。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或 setter 可以在子类中被覆盖。

【讨论】:

    【解决方案3】:

    这里有几个可行的答案,但如果您仍然想使用属性格式并让您的代码看起来干净,您可以编写一个扩展:

    fun String.toEditable(): Editable =  Editable.Factory.getInstance().newEditable(this)
    

    然后你可以这样使用它:

    mEditText.text = myString.toEditable()
    

    【讨论】:

    • 扩展方法比使用旧的 java setText 更好。
    • 更好地扩展编辑文本:fun EditText.setEditableText(text:String){ this.text = Editable.Factory.getInstance().newEditable(text) }
    【解决方案4】:

    如果要从原理上使用getter .text,请使用:

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

    【讨论】:

      【解决方案5】:

      简单的解决方案

      只需使用edittext.setText(yourdata) 而不是edittext.text,因为EditText 是可编辑的,edittext.text 用于TextView

      例如:

      var name:String = "Muzammil"
      edittext.setText(name)
      

      这就是它对我的工作。

      【讨论】:

      • 比 nhaarman 的回答稍微好一点的解释。
      【解决方案6】:

      castTextView 但我相信这应该在 kotlin 方面进行修复,以方便开发人员!

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

      【讨论】:

      • 为什么这被否决了?看起来和 Kotlin 中的其他任何东西一样完全合理。
      • @SMBiggs 可能有太多相似的答案,我只是猜测这是我的哈哈
      • 或者使用 someEditText.setText("new value") 而不是设置 text 属性。
      【解决方案7】:

      或者您可以使用扩展属性:

      var EditText.value
          get() = this.text.toString()
          set(value) {
                  this.setText(value)
          }
      

      并使用.value= 而不是.text=

      【讨论】:

        【解决方案8】:

        遵循 Java 的 getter 和 setter 约定的方法(名称以 get 开头的无参数方法和名称以 set 开头的单参数方法)在 Kotlin 中表示为属性。 但是,在为 Java getter/setter 对生成属性时,Kotlin 最初会寻找一个 getter。 getter 足以从 getter 的类型推断出属性的类型。另一方面,如果只存在 setter,则不会创建属性(因为 Kotlin 目前不支持仅设置属性)。

        当 setter 发挥作用时,属性生成过程变得有点模糊。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或 setter 可以在子类中被覆盖, 这正是 android 中的 EditText 的情况。

        在上述情况下,Android TextView 类包含一个 getter

        CharSequence getText() 
        

        还有一个setter void

        setText(CharSequence)
        

        如果我有一个 TextView 类型的变量,我的代码就可以正常工作。 但我使用了 EditText 类,它包含一个被覆盖的 getter

        Editable getText()
        

        这意味着您可以获得 EditText 的 Editable 并将 Editable 设置为 EditText。因此,Kotlin 合理地创建了 Editable 类型的合成属性文本。由于 String 类不可编辑,所以我不能将 String 实例分配给 EditText 类的 text 属性。

        似乎 JetBrains 在为 Java getter 和 setter 方法生成 kotlin 属性时忘记指定 getter 方法的主导作用。无论如何,我已经通过 github 向 Jet Brains kotlin 网站提交了拉取请求。

        我在这篇中等帖子中也详细说明了上述问题How Does Kotlin Generate Property from Java Getters and Setters (Undocumented by Jetbrains)

        【讨论】:

          【解决方案9】:

          我在我的项目中遇到了同样的问题,我给你一个例子来展示如何使用 Kotlin 在布局中检索和设置数据: 有一个按钮save_button 和两个文本编辑字段edit_nameedit_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")
                          }
          

          【讨论】:

            【解决方案10】:

            这样使用:

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

            【讨论】:

              【解决方案11】:

              setText(String),所以你必须将你的字符串设置为editText,所以在你的情况下是:nametxt.setText(name)

              【讨论】:

                【解决方案12】:

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

                editText.text = 可编辑

                【讨论】:

                  【解决方案13】:

                  看EditText的API:

                  void setText (CharSequence text, TextView.BufferType type)

                  Editable getText ()

                  链接:https://developer.android.com/reference/android/widget/EditText.html

                  【讨论】:

                    【解决方案14】:

                    尝试使用 nametxt.post:nametxt.post({nametxt.setText("your text")})

                    【讨论】:

                      猜你喜欢
                      • 2011-06-03
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-11-22
                      相关资源
                      最近更新 更多