Impostazione del testo in EditText Kotlin


148

Sto cercando di impostare il testo in un EditText ma dice:

Type mismatch. 
Required: Editable 
Found: String

Il mio codice è il seguente:

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

Non dire di usare setTextperché sto usando kotlin, non Java.



A parte: non è necessario findViewById se si utilizzano le estensioni Android Kotlin (fornite con Android Studio). Dovresti essere in grado di chiamare nexttxt.setText(name)senza trovare o trasmettere.
AjahnCharles,

Questo non è un codice Kotlin come stai sostenendo @Singh
Sazzad Hissain Khan

Risposte:


310

Utilizzare setText(String), poiché editText.textprevede un Editable, non un String.


né EditText ottiene lo stato attivo dopo setText () né softInput tastiera aperta
Saurabh Bhandari

Ma perché? Sembra così simile !!
Malwinder Singh

36

Utilizzare setText(String)come EditText.textrichiede editableal primo posto non String

PERCHÉ ?

Bella spiegazione di Michael fornita sotto questo link . Visita questo link per maggiori dettagli

Quando si genera una proprietà sintetica per una coppia getter / setter Java, Kotlin cerca innanzitutto un getter. Il getter è sufficiente per creare una proprietà sintetica con un tipo di getter. D'altra parte la proprietà non verrà creata se si presenta solo un setter.

Quando un setter entra in gioco la creazione di proprietà diventa più difficile. Il motivo è che il getter e il setter possono avere tipi diversi. Inoltre, il getter e / o il setter possono essere sovrascritti in una sottoclasse.


22

Ci sono diverse risposte funzionanti qui, ma se vuoi ancora usare il formato della proprietà e avere il tuo codice pulito, puoi scrivere un'estensione:

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

È quindi possibile utilizzarlo come tale:

mEditText.text = myString.toEditable()

1
L'approccio all'estensione è migliore rispetto all'utilizzo di java setText precedente.
Piotr Badura,

18

Se vuoi usare getter .textdal principio, usa:

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

3

Oppure puoi usare una proprietà di estensione:

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

e usa .value=invece di.text=


2

I metodi che seguono le convenzioni Java per getter e setter (metodi senza argomento con nomi che iniziano con get e metodi con argomento singolo con nomi che iniziano con set) sono rappresentati come proprietà in Kotlin. Ma, mentre genera una proprietà per una coppia getter / setter Java, Kotlin inizialmente cerca un getter. Il getter è sufficiente per dedurre il tipo di proprietà dal tipo di getter. D'altra parte, la proprietà non verrà creata se è presente solo un setter (poiché Kotlin non supporta al momento proprietà solo set).

Quando entra in gioco un setter, il processo di generazione della proprietà diventa un po 'ambiguo. Il motivo è che il getter e il setter possono avere tipi diversi. Inoltre, il getter e / o il setter possono essere sovrascritti in una sottoclasse, che è esattamente il caso di EditText in Android.

Nel caso precedente, la classe TextView di Android contiene un getter

CharSequence getText() 

e un setter vuoto

setText(CharSequence)

Se avessi avuto una variabile di tipo TextView il mio codice avrebbe funzionato bene. Ma ho usato la classe EditText che contiene un getter sovrascritto

Editable getText()

ciò significa che è possibile ottenere un modificabile per un EditText e impostare un modificabile su un EditText. Pertanto, Kotlin crea ragionevolmente un testo di proprietà sintetica di tipo modificabile. Poiché la classe String non è modificabile, ecco perché non posso assegnare un'istanza String alla proprietà text della classe EditText.

Sembra che JetBrains abbia dimenticato di specificare il ruolo dominante dei metodi getter durante la generazione di proprietà kotlin per i metodi getter e setter Java. Ad ogni modo, ho inviato una richiesta pull al sito Web di Jet Brains Kotlin tramite github.

Ho dettagliato il problema sopra in questo post medio Come fa Kotlin a generare proprietà da Getter e setter Java (non documentato da Jetbrains)


0

Ho avuto lo stesso problema nei miei progetti, vi do un esempio che mostra come recuperare e impostare i dati nei layout usando Kotlin: c'è un pulsante save_buttone due campi di modifica del testo 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")
                }

0

Soluzione semplice

Basta usare edittext.setText(yourdata) invece che edittext.textperché EditText è modificabile, edittext.textviene utilizzato perTextView

Per esempio:

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

Questo è il suo lavoro per me.


0

Usa così:

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

-1

setText (String), quindi devi impostareText la stringa per editText, quindi nel tuo caso è: nametxt.setText (nome)


-2

O getto a TextViewma credo che questo deve essere fissato sul lato Kotlin di sicuro per comodità di sviluppatori!

(someEditText as TextView).text = "someTextValue"

O con alcune estensioni:

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

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

Tu puoi scrivere:

someEditText.asTextView.text = "someTextValue"

o

someEditText.value = "someTextValue"

Ma purtroppo non puoi semplicemente scrivere semplicesomeEditText.text = "someTextValue"



-6

Prova a utilizzare nametxt.post: nametxt.post ({nametxt.setText ("il tuo testo")})

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.