VOOZH about

URL: https://qiita.com/AAkira/items/e0baa9e5ed42bd2300c0

⇱ Kotlinでコールバック #Android - Qiita


👁 Image
35

Go to list of users who liked

34

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

More than 5 years have passed since last update.

@AAkirain👁 Image
株式会社サイバーエージェント

Kotlinでコールバック

35
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に限って使うのならば問題ないと感じました。

35

Go to list of users who liked

34
1

Go to list of comments

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
35

Go to list of users who liked

34