Definindo texto no EditText Kotlin

148

Estou tentando definir texto em um EditText, mas ele diz:

Type mismatch. 
Required: Editable 
Found: String

Meu código é o seguinte:

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

Não diga para usar setTextporque estou usando o kotlin, não o Java.

Paramjeet Singh
fonte
Além disso: você não precisa do findViewById se usar as extensões do Kotlin para Android (fornecidas com o Android Studio). Você só deve poder ligar nexttxt.setText(name)sem encontrar ou transmitir.
AjahnCharles
Este não é um código Kotlin, como você está reivindicando @Singh
Sazzad Hissain Khan

Respostas:

310

Use setText(String), já que editText.textespera um Editable, não um String.

nhaarman
fonte
nem o EditText obtém o foco após o setText () nem o teclado softInput aberto
Saurabh Bhandari
Mas por que? Parece tão parecido !!
Malwinder Singh
36

Use setText(String)como EditText.textrequer um editableno primeiro lugar, não String

PORQUE ?

Boa explicação de Michael dada neste link . Visite este link para obter mais detalhes

Ao gerar uma propriedade sintética para um par getter / setter Java, o Kotlin primeiro procura um getter. O getter é suficiente para criar uma propriedade sintética com um tipo de getter. Por outro lado, a propriedade não será criada se apenas um levantador apresentar.

Quando um levantador entra em jogo, a criação de propriedade se torna mais difícil. O motivo é que o getter e o setter podem ter tipos diferentes. Além disso, o getter e / ou o setter podem ser substituídos em uma subclasse.

Rahul Khurana
fonte
22

Existem várias respostas úteis aqui, mas se você ainda quiser usar o formato da propriedade e deixar seu código limpo, poderá escrever uma extensão:

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

Você pode usá-lo como tal:

mEditText.text = myString.toEditable()
BNY
fonte
1
A abordagem de extensão é melhor do que usar o antigo java setText.
Piotr Badura
18

Se você deseja usar o getter .textfrom princípio, use:

nametxt.text = Editable.Factory.getInstance().newEditable(name)
Evgeniy Pavlov
fonte
3

Ou você pode usar uma propriedade de extensão:

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

e use em .value=vez de.text=

letroll
fonte
2

Os métodos que seguem as convenções Java para getters e setters (métodos sem argumento com nomes começando com get e métodos de argumento único com nomes começando com set) são representados como propriedades no Kotlin. Porém, ao gerar uma propriedade para um par getter / setter Java, o Kotlin primeiro procura por um getter. O getter é suficiente para inferir o tipo de propriedade do tipo do getter. Por outro lado, a propriedade não será criada se apenas um setter estiver presente (porque o Kotlin não suporta propriedades somente de set no momento).

Quando um levantador entra em ação, o processo de geração de propriedade se torna um pouco ambíguo. O motivo é que o getter e o setter podem ter tipos diferentes. Além disso, o getter e / ou o setter podem ser substituídos em uma subclasse, o que é exatamente o caso do EditText no Android.

No caso acima, a classe Android TextView contém um getter

CharSequence getText() 

e um setter vazio

setText(CharSequence)

Se eu tivesse uma variável do tipo TextView, meu código teria funcionado bem. Mas eu usei a classe EditText que contém um getter substituído

Editable getText()

o que significa que você pode obter um Editável para um EditText e definir um Editável como um EditText. Portanto, Kotlin cria razoavelmente um texto de propriedade sintético do tipo Editável. Como a classe String não é editável, é por isso que não posso atribuir uma instância de String à propriedade text da classe EditText.

Parece que o JetBrains esqueceu de especificar o papel dominante dos métodos getter ao gerar propriedades kotlin para os métodos getter e setter Java. De qualquer forma, enviei uma solicitação de recebimento ao site da Jet brains kotlin através do github.

Também detalhei o problema acima neste post médio Como o Kotlin gera propriedades a partir de Java Getters e Setters (Não documentado por Jetbrains)

Abhishek Luthra
fonte
0

Eu tive o mesmo problema em meus projetos. Dou um exemplo que mostra como recuperar e definir dados nos layouts usando o Kotlin: há um botão save_buttone dois campos de edição de texto edit_namee 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")
                }
Sadiki Ayoub
fonte
0

Solução Simples

Basta usar edittext.setText(yourdata) em vez de edittext.textporque o EditText é editável, o edittext.texté usado paraTextView

Por exemplo:

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

É isso que funciona para mim.

Muzammil
fonte
0

Use assim:

edtTitle.setText(intent.getStringExtra(EXTRA_TITLE))
edtDesc.setText(intent.getStringExtra(EXTRA_DESC))
sana ebadi
fonte
-1

setText (String), então você deve setText sua string para editText, portanto, no seu caso, é: nametxt.setText (name)

Edwin Kurnia Rahman
fonte
-2

Ou elenco para TextViewmas acredito que esta deve ser fixado no lado Kotlin com certeza para facilidade de desenvolvedores!

(someEditText as TextView).text = "someTextValue"

Ou com algumas extensões:

val EditText.asTextView: TextView get() = this as TextView

var EditText.value: CharSequence? 
    get() = asTextView.text
    set(value) {
        asTextView.text = value
    }

Você pode escrever:

someEditText.asTextView.text = "someTextValue"

ou

someEditText.value = "someTextValue"

Mas, infelizmente, você simplesmente não pode escrever simplessomeEditText.text = "someTextValue"

Renetik
fonte
-6

Tente usar nametxt.post: nametxt.post ({nametxt.setText ("seu texto")})

Denys Lobur
fonte