Google Playにkotlinで作り直したBatteryCrystalをリリースしてみました。
Javaで作られたアプリをKotlinで作り直して行く上で、とてもイライラもしつつも、面白かったです。
なので、kotlinでAndroidアプリを作るためのTipsを書いていこうかなと思います。
まぁ正直なところ、自分のための備忘録ですw
その前にアプリの紹介を少々。
BatteryCrystalは、バッテリーの残量を表示するウィジェットです。また、ウィジェットをタップすると、WiFiやBluetoothやGPSのON,OFFや、マナーモードの切り替えなどができます。ウィジェットがメインのアプリなので、普通のアプリとはちょっと違いますが、そのためいろいろと楽しめました。
Intentを作るには?
次のActivityを呼び出すために、Intentを作りますよね。しかし、kotlinではどうやればいいのかわからなくてハマりました。正解は、以下のようになります。
val intent = Intent(getApplicationContext(), javaClass<OtherActivity>())
定数を作るには?
Javaだと定数は以下のように定義します。
class MainActivity extends Activity { public static final String HOGE = "HOGE"; private final String PIYO = "PIYO"; }
Kotlinでは、以下のようにします。
class MainActivity() : Activity() { private val PIYO = "PIYO" class object { val HOGE = "HOGE" } }
staticメソッドを定義するには?
これも定数と同様に、class objectで定義します。
まず、Javaだとこうですね。
class MainActivity extends Activity { static public String hoge(String piyo) { return "hoge " + piyo; } }
MainActivity.hoge(“piyo”); で呼び出しますね。
kotlinだとこうなります。
class MainActivity() : Activity() { class object { fun hoge(piyo : String?) : String? { return "hoge $piyo" } } }
MainActivity.hoge(“piyo”) で呼び出せます。
匿名クラスを作るには?
バッテリーの残量が変わったらBroadcastが走りますね。それを拾うBroadcastReceiverをメンバ変数に定義しているのですが、それの定義方法を紹介します。
まず、Javaだとこう。
// mReceiverはMainActivityのメンバ変数とする private BroadcastReceiver mReceiver = new BroadcastReceiver() { @override public void onReceive(Context context, Intent intent) { // 処理 } }
kotlinだとこうなります。
private val mReceiver = object : BroadcastReceiver() { public override fun onReceive(context : Context?, intent : Intent?) { // 処理 } }
switch文を作るには?
kotlinには、switch文ではなく、whenをつかいます。
まずはJavaで。
String test; switch(batteryState) { case 0: case 1: // 処理1 test = "hoge"; break; case 2: // 処理2 // 複数行にまたがる処理 String a = "pi"; String b = "yo"; test = a + b; break; case 3: // 処理3 test = "fuga"; break; default: test = "kotlin" break; }
kotlinでは、こうなる!しかも、whenなので、戻り値を受け取れるので、こう書けます!
まるでRubyのcase文ですね。これだけですごくいいなぁ〜と思いました。
val test = when(batteryState) { 0, 1 -> "hoge" 2 -> { val a = "pi" val b = "yo" a + b // 最後のが戻り値になります } 3 -> "fuga" in 4..10 -> "range" // 範囲を表すこともできる! else -> "kotlin" }
kotlinで開発する場合は、IDEはIntellijだけになりますが、kotlinの開発元はIntellijを作っているJetBrainsなので、IDEで困ることはありません。また、IntellijでAndroidアプリを作るのに困る点も別にありません。よっぽどEclipseに慣れているということであれば別かもしれませんが…。
次に1から作るアプリはkotlinでやってみようかなと思います。