36
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kotlinでコールバック

Last updated at Posted at 2016-03-05

Eventbus等がとても便利なため、最近では使用機会が減っているのかもしれませんが、
Androidでは自作のView等からActivityやFragmentに対して何らかのコールバックをする場面が多々あります。
Kotlinのプロパティを使うとJavaで書いていたコールバック処理がとても簡潔に書けます。

Java


public class CustomView extends View {

    private CallBack callBack;

    public void setCallBack(CallBack callBack) {
        this.callBack = callBack
    } 

    private void hoge() {
        if(callBack == null) return;
    
        callBack.onClickHoge(); // call here
    }

    public interface CallBack {
        public void onClickHoge();
    }
}

public class HogeActivity extends AppCompatActivity implements CallBack {

    @Override
    public void onClickHoge() {
        ...
    }
}

こんな感じのコードを見たことあるかと思います。
Kotlinのプロパティと関数リテラルを用いると上記のJavaコードがこのようになります。

Kotlin


class CustomView : View {

    var onClickHoge: (() -> Unit)? = null

    private void hoge() {
        onClickHoge?.invoke() // call here
    }
}

class HogeActivity : AppCompatActivity {
    val view: CustomView by bindView(R.id.customView) // kotter knife

    fun hoge() {
        view.onClickHoge = {
            ...
        }
    }
}

これだけです。
とても簡潔ですね。

早期return

ただ、この書き方だとただのBlockになってしまうので、以下のような早期returnが出来ません。

view.onClickHoge = {
    if(foo == 0) return
    
    ....
}

そこで、Jump Labelを使います。


view.onClickHoge = block@ {
    if(foo == 0) return@block

    ....
}

Jump Labelは個人的にGoto文のようになってしまうので、あまり使いたくは無かったのですが
このように数行のblock内での早期retunに限って使うのならば問題ないと感じました。

36
35
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?