15

Kotlin では、クラスに複数のコンストラクターがある場合、別のコンストラクター内から指定された(iOS の世界から来た私はより良い名前を見つけることができませんでした) コンストラクターをどのように呼び出すことができますか。

例をお見せしましょう

final class LoadingButton: LinearLayout {
    var text:String? = null

    constructor(context: Context, text: String) : this(context) {
        this.text = text
    }
    constructor(context: Context) : super(context) {
        val t = this.text
        this.view {
            button(t) { /* ... */}
        }
    }
}

ここで、便利なコンストラクター内のコードの前に呼び出されるloadingButton("TEST", {})ため、その文字列はボタンに伝達されません (申し訳ありません:)。this(context)

それはKotlinで解決できますか?何かのようなもの

constructor(context: Context, text: String) {
    this.text = text
    this(context) 
}

編集

質問されたのでアイデアを明確にするために、アイデアはアクティビティで次のようなものを書くことです:

onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    verticalLayout {
        loadingButton("Some text")
        //or
        loadingButton() { this.text = "Some text"}
}

これは明らかにそれほど有用ではありませんが、アイデアは得られます。テキスト プロパティは、構築時または後で知ることができます。

Kotlinにはパラメーターのデフォルト値があるため、これは特に役に立ちませんが、言語を勉強していて、この問題に遭遇しました。

編集2

別の明確化は、レイアウトにAnkoloadingButtonを使用していることです。そのため、メソッドは次のようになります。

inline fun ViewManager.loadingButton() = loadingButton {  }
inline fun ViewManager.loadingButton(init: LoadingButton.() -> Unit) = ankoView({ LoadingButton(it) }, init)
inline fun ViewManager.loadingButton(text: String, init: LoadingButton.() -> Unit) = ankoView({ LoadingButton(it, text) }, init)
4

1 に答える 1