EditText Kotlin'de metin ayarlama


148

EditText metin ayarlamak için çalışıyorum ama diyor:

Type mismatch. 
Required: Editable 
Found: String

Kodum aşağıdaki gibidir:

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

Kullanmayı söyleme setTextçünkü Java değil kotlin kullanıyorum.



Bir yana: Kotlin Android uzantılarını (Android Studio ile birlikte gönderilir) kullanıyorsanız findViewById'ye ihtiyacınız yoktur. nexttxt.setText(name)Herhangi bir buluntu veya döküm yapmadan arayabiliyor olmanız gerekir .
AjahnCharles

Yanıtlar:


310

Kullanımı setText(String), çünkü editText.textbeklemek Editabledeğil, a String.


setText () veya softInput klavye açıldıktan sonra nihayet odaklanın
Saurabh Bhandari

Ama neden? Kulağa çok benziyor !!
Malwinder Singh

36

Kullanım setText(String)olarak EditText.textbir gerektiriyor editabledize değil firstplace de

NEDEN ?

Bu bağlantı altında Michael tarafından yapılan güzel açıklama . Daha fazla ayrıntı için bu bağlantıyı ziyaret edin

Bir Java alıcı / ayarlayıcı çifti için sentetik bir özellik oluştururken Kotlin önce bir alıcı arar. Alıcı, bir tür alıcı ile sentetik bir özellik oluşturmak için yeterlidir. Öte yandan, yalnızca bir ayarlayıcı sunulursa özellik oluşturulmaz.

Bir pasör oyuna girdiğinde mülk yaratma zorlaşır. Nedeni, alıcı ve ayarlayıcının farklı tipte olması olabilir. Ayrıca, alıcı ve / veya ayarlayıcı bir alt sınıfta geçersiz kılınabilir.


22

Burada birkaç çalışma yanıtı var, ancak yine de özellik biçimini kullanmak ve kodunuzun temiz görünmesini istiyorsanız, bir uzantı yazabilirsiniz:

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

Daha sonra bu şekilde kullanabilirsiniz:

mEditText.text = myString.toEditable()

1
Eklenti yaklaşımı eski java setText kullanmaktan daha iyidir.
Piotr Badura

18

Alıcıyı .textprensipten kullanmak istiyorsanız , şunu kullanın:

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

3

Veya bir extension özelliği kullanabilirsiniz:

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

ve .value=yerine kullan.text=


2

Alıcı ve ayarlayıcılar için Java kurallarını izleyen yöntemler (get ile başlayan isimlerle argümansız yöntemler ve set ile başlayan isimlerle tek argümanlı yöntemler) Kotlin'de özellikler olarak temsil edilir. Ancak, Java alıcı / ayarlayıcı çifti için bir mülk oluştururken Kotlin ilk önce bir alıcı arıyor. Alıcı, mülk türünü, alıcı türünden çıkarmak için yeterlidir. Öte yandan, yalnızca bir ayarlayıcı varsa özellik oluşturulmaz (çünkü Kotlin şu anda yalnızca ayarlı özellikleri desteklemez).

Bir pasör devreye girdiğinde, mülk yaratma süreci biraz belirsizleşir. Nedeni, alıcı ve ayarlayıcının farklı tipte olması olabilir. Dahası, alıcı ve / veya ayarlayıcı, bir alt sınıfta geçersiz kılınabilir, bu da android'de EditText örneğidir.

Yukarıdaki durumda Android TextView sınıfı bir alıcı içerir

CharSequence getText() 

ve bir pasör geçersiz

setText(CharSequence)

TextView türünde bir değişkenim olsaydı kodum iyi çalışırdı. Ama geçersiz kılınmış bir alıcı içeren EditText sınıfını kullandım

Editable getText()

yani bir EditText için Düzenlenebilir alabilir ve bir EditText için Düzenlenebilir ayarlayabilirsiniz. Bu nedenle, Kotlin makul bir şekilde Düzenlenebilir türünde bir sentetik özellik metni oluşturur. String sınıfı Düzenlenebilir olmadığından, bu nedenle EditText sınıfının text özelliğine bir String örneği atayamam.

JetBrains, Java alıcı ve ayarlayıcı yöntemleri için kotlin özellikleri oluştururken alıcı yöntemlerinin baskın rolünü belirtmeyi unutmuş gibi görünüyor. Her neyse, jet beyin kotlin web sitesine github aracılığıyla çekme isteği gönderdim.

Bu orta mesajda da yukarıdaki problemim var , Kotlin Java Getters and Setters'tan Nasıl Özellik Yaratıyor (Jetbrains tarafından Belgelenmemiş)


0

Projelerimde de aynı sorunu yaşadım, Kotlin'i kullanarak mizanpajlardaki verileri nasıl alacağınızı ve ayarlayacağınızı gösteren bir örnek veriyorum: bir düğme save_buttonve iki metin düzenleme alanı edit_nameve 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

Basit Çözüm

Hemen kullanım edittext.setText(yourdatayerine) edittext.textnedeniyle EditText düzenlenebilir, edittext.textkullanılırTextView

Örneğin:

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

Benim için bu iş.


0

Bunun gibi kullanın:

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

-1

setText (String), bu nedenle dizenizi editText'e ayarlamanız gerekir, bu durumda sizin durumunuz: nametxt.setText (name)


-2

Ya da oyuncular için TextViewama bunun geliştiricilerin rahatlığı için kesinlikle kotlin tarafına sabitlenmesi gerektiğine inanıyorum!

(someEditText as TextView).text = "someTextValue"

Veya bazı uzantılarla:

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

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

Yazabilirsin:

someEditText.asTextView.text = "someTextValue"

veya

someEditText.value = "someTextValue"

Ama ne yazık ki sadece can not bilgileri basitsomeEditText.text = "someTextValue"



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.