私はAndroidプロジェクトをKotlinに切り替えようとしています。ヒントを設定したいEditText
(TextView
のサブクラス)がありますテキストはプログラムで作成します。ヒントは期待どおりに動作しますが、テキストの場合、Kotlin setter構文を使用してそれを行おうとすると、型の不一致の例外が発生します。
_ val test = EditText(context)
test.setHint("hint") // Lint message: "Use property access syntax"
test.hint = "hint" // ok
test.setText("text") // ok (no lint message)
test.text = "text" // Type mismatch: inferred type is kotlin.String but Android.text.Editable! was expected
_
宣言を見ると、TextView
から継承された同一の署名が見つかります。
_ public final void setHint(CharSequence hint)
public final void setText(CharSequence text)
_
_x.y = z
_はx.setY(z)
のショートカットであるという印象がありましたが、明らかにその印象は間違っていました。 setText()
はセッターではなく通常のメソッドとして扱われますが、コンパイラーの動作を変えるこれら2つのメソッドの違いは何ですか?私が考えることができる唯一のものは、TextView
がmHint
プロパティを持っているということですが、そうではないかもしれません。
私がよく理解していないもう1つのことは、_Android.text.Editable
_はどこから来たのですか?対応するsetText(Editable)
メソッドはなく、このタイプのパブリックフィールドもありません。
Javaゲッター/セッターペアの合成プロパティを生成する場合、Kotlinは最初にゲッターを探します。ゲッターはゲッターのタイプで合成プロパティを作成するのに十分です。一方、プロパティセッターのみが存在する場合は作成されません。
セッターがプレイに入ると、プロパティの作成がより難しくなります。その理由は、ゲッターとセッターのタイプが異なる可能性があるためです。さらに、サブクラスでゲッターおよび/またはセッターをオーバーライドできます。
あなたの場合、TextView
クラスにはゲッターCharSequence getText()
とセッターvoid setText(CharSequence)
が含まれています。タイプTextView
の変数がある場合、コードは正常に機能します。しかし、EditText
型の変数があります。また、EditText
クラスにはオーバーライドされたゲッターEditable getText()
が含まれています。つまり、Editable
のEditText
を取得し、Editable
をEditText
に設定できます。したがって、Kotlinはタイプtext
の合成プロパティEditable
を合理的に作成します。 String
クラスはEditable
ではありません。そのため、String
インスタンスをtext
クラスのEditText
プロパティに割り当てることはできません。
型の不一致を避けるために、EditableクラスのFactory内部クラスを使用できます。そのため、次のようなことができます。
textview.text = Editable.Factory.getInstance().newEditable("your text")
または、拡張機能を作成することもできます。
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
その後、次のように使用できます。
mEditText.text = myString.toEditable()
_Android.text.Editable
_は getText()
に由来します。 Kotlinの_obj.text = value
_解決は2ステッププロセスであるように思われます。
text
プロパティまたはJava method getText
からプロパティタイプを推測しようとするsetText(PropertyType value)
1.では、推定される型はEditable
であるため、_editText.text = "value"
_は_Type mismatch
_エラーで失敗します。