EditText Kotlinでのテキストの設定


147

EditTextにテキストを設定しようとしていますが、次のように書かれています。

Type mismatch. 
Required: Editable 
Found: String

私のコードは次のとおりです:

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

私はsetTextJavaではなくkotlin を使用しているので、使用しないでください。



余談:Kotlin Android拡張機能(Android Studioに付属)を使用する場合、findViewByIdは必要ありません。nexttxt.setText(name)検索やキャストをせずに呼び出すことができます。
AjahnCharles

@Singhを主張しているため、これはKotlinコードではありません
Sazzad Hissain Khan

回答:


310

使用setText(String)以来、editText.textを期待Editable、ではありませんString


EditTextがsetText()またはsoftInputキーボードを開いた後にフォーカスを取得
Saurabh Bhandari

しかし、なぜ?よく似てるね!
Malwinder Singh

36

使用setText(String)としてEditText.text必要とeditablefirstplaceない文字列で

どうして ?

このリンクの下で与えられたマイケルによる素晴らしい説明。詳細については、このリンクにアクセスしてください

Java getter / setterペアの合成プロパティを生成するとき、Kotlinは最初にgetterを探します。ゲッターは、ゲッターのタイプを使用して合成プロパティを作成するのに十分です。一方、セッターのみが存在する場合、プロパティは作成されません。

セッターが場に出ると、物件の作成が難しくなります。その理由は、ゲッターとセッターの型が異なる可能性があるためです。さらに、ゲッターおよび/またはセッターはサブクラスでオーバーライドできます。


22

ここにはいくつかの実用的な答えがありますが、プロパティ形式を使用してコードをきれいに見せたい場合は、拡張機能を作成できます。

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

その後、次のように使用できます。

mEditText.text = myString.toEditable()

1
拡張アプローチは、古いjava setTextを使用するよりも優れています。
Piotr Badura


3

または、拡張プロパティを使用できます。

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

.value=代わりに使用.text=


2

getterとsetterのJavaの規則に従うメソッド(名前がgetで始まる引数のないメソッドと名前がsetで始まる単一の引数のメソッド)は、Kotlinではプロパティとして表されます。しかし、Javaゲッターとセッターのペアのプロパティを生成する際、Kotlinは最初にゲッターを探します。ゲッターは、ゲッターのタイプからプロパティのタイプを推測するのに十分です。一方、セッターのみが存在する場合、プロパティは作成されません(現時点ではKotlinはセットのみのプロパティをサポートしていないため)。

セッターが登場すると、プロパティの生成プロセスは少しあいまいになります。その理由は、ゲッターとセッターの型が異なる可能性があるためです。さらに、ゲッターやセッターはサブクラスでオーバーライドできます。これは、AndroidのEditTextの場合とまったく同じです。

上記の場合、Android TextViewクラスにはゲッターが含まれています

CharSequence getText() 

そしてセッターボイド

setText(CharSequence)

TextView型の変数がある場合、コードは正常に機能します。しかし、オーバーライドされたゲッターを含むEditTextクラスを使用しました

Editable getText()

つまり、EditTextのEditableを取得し、EditableをEditTextに設定できます。したがって、Kotlinは、編集可能タイプの合成プロパティテキストを合理的に作成します。Stringクラスは編集可能ではないため、EditTextクラスのtextプロパティにStringインスタンスを割り当てることができません。

JetBrainsがJava getterおよびsetterメソッドのkotlinプロパティを生成するときにgetterメソッドの主要な役割を指定するのを忘れたようです。とにかく、私はgithubを介してJet brains kotlinウェブサイトにプルリクエストを送信しました。

この中程度の投稿でも上記の問題について詳しく説明しています。KotlinはJavaゲッターとセッターからプロパティをどのように生成しますか(Jetbrainsには文書化されていません


0

私のプロジェクトでも同じ問題が発生しました。Kotlinを使用してレイアウトのデータを取得および設定する方法を示す例を示します。1つのボタンsave_buttonと2つのテキスト編集フィールドedit_nameとがあり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

シンプルなソリューション

ただ、使用edittext.setText(yourdataの代わりに)edittext.textためのEditTextが編集可能である、edittext.textのために使用されていますTextView

例えば:

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

それが私の仕事です。


0

次のように使用します。

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


-2

またはにキャストしますTextViewが、開発者の便宜のためにこれは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"



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.