Kotlinを使ってAndroidの開発を始めてみる

# 最初に

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2016/whiteplus "")  2016 2日目になります。

こんにちは。株式会社ホワイトプラス、エンジニアの @knakamigawa です。

私はホワイトプラスでは、
- 衣類オンラインクリーニングの[リネット](https://www.lenet.jp/)
- 布団オンラインクリーニングの[ふとんリネット](http://www.futonlenet.jp/)
- 靴オンラインクリーニングの[くつリネット](http://www.kutsulenet.jp/)

の各サービスをお客様が触れるWeb全般について
フロントエンドからサーバーサイドまで広く担当しています。

# 前提

- この記事自体割と再生産な感じなので、すでにKotlinに触れている人には新しい発見は無いと思います。
- ターゲットはAndroidです。でもAndroidの細かい話はしません
- エミュレータはいろいろ面倒なので動作確認は実機を使います
- Mac向けです（Windowsでも大差はありませんが
- Kotlinで業務していません
- というか私は業務でAndroidアプリ担当してません
- 私が趣味でKotlinをちょっと触って感動したので業務にも展開したいなーという野心

# Kotlinってなんぞ？

詳細は[他](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=kotlin)を参照頂くとしてざっくりと。

Android Studioの中身、IntelliJの開発元であるJetBrainsが開発している言語で。

KotlinをコンパイルするとJavaのバイトコードを生成し、Java VM上で実行されます。
そのためJavaと高い互換性を持ちます。

Javaと比べてSwiftやES2015のような関数型的な書き方やセミコロンレス。オプショナルなど今時なコードスタイルとなっています。

# 書く準備

## Android Studioをインストールしよう

[Android Studioダウンロードページ](https://developer.android.com/studio/index.html)

本稿執筆時点の最新バージョンは2.2.2です。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/148354/44e353a2-b684-e8f9-e8bd-e44890c45222.png)

インストール手順は公式の分かりやすい物があるのでそちらを参照してください。  
Javaをインストールしていない場合、インストールを忘れないように！

[インストール手順](https://developer.android.com/studio/install.html)


## Kotlin Pluginの導入

Android Studioを起動して[Configure]->[Plugins]を選択肢Pluginの管理画面を表示します。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/148354/33fb27a7-6c8e-fd5c-ef63-3083e030028f.png)

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/148354/5fc4400d-3c44-fa7b-9116-1643d8abd41f.png)


[Browse Repositories...]を選択して、検索窓に[Kotlin]と入力し検索。

![image4.png](https://qiita-image-store.s3.amazonaws.com/0/148354/b48e0d22-176e-11da-4e50-273f1bbd25a1.png)


[install]を押すと以下のようにインストールが開始されますが非常に時間が掛かります。

![image5.png](https://qiita-image-store.s3.amazonaws.com/0/148354/67600fb7-9554-1913-f85b-3763921f974f.png)


タイミングによっては失敗することも有るようなので、時間をおいて再度試して見てください。

だめならば[JetBrainsのpluginsページ](https://plugins.jetbrains.com/plugin/6954)から直接ダウンロードしてAndroid StudioのPlugins画面の[Install plugin from disk...]からダウンロードしたファイルを選択してインストールしてください。  
ただし、ダウンロードも時間がかかり。失敗することもあります。。。（chromeなら再開をすると上手く続きから再開できることもあります。

本稿執筆時点の最新バージョンは1.0.5です。

[1.0.5-release-Studio2.2-2]のStudio2.2-2がAndroid Studio 2.2.2用を指しています。  
Android Studioのバージョンに合わせて選んでください。



## Kotlin Projectのセットアップ

[Start a new Android Studio project]を押して新規Project（Empty Activity）を作成します。


MainActivityを選択肢。メニューバーの[Code]から[Convert Java File to Kotlin File]を選びます。

![image6.png](https://qiita-image-store.s3.amazonaws.com/0/148354/5e4c2fae-24e7-430b-5818-4aee0f61af22.png)


そうすると自動的にKotlinへと変換されます。

![image7.png](https://qiita-image-store.s3.amazonaws.com/0/148354/681a3648-ca3e-4c5f-daf8-6bcf768582ed.png)


変換されたファイルはアイコンにKotlinのマークが付きます。

MainActivityを開くとKotlinのコンフィグがないと言われるので。（Kotlin not configred）  
右の[Configre]をクリックして開いたウィンドウでOKを押してコンフィグを作成する。

![image8.png](https://qiita-image-store.s3.amazonaws.com/0/148354/cfde9c29-75e8-2fe1-4d2b-a0040eaacb98.png)

![image9.png](https://qiita-image-store.s3.amazonaws.com/0/148354/eed1b5b6-4a70-0883-0c99-138079b16360.png)


作成したコンフィグを再読込しろと言われるので[Sync Now]を押します。

![image10.png](https://qiita-image-store.s3.amazonaws.com/0/148354/c322517e-fc68-1c1c-202c-efa9fcdfb925.png)

これでKotlinでAndroidアプリを書く準備が完了です。

お疲れ様でした。

## Kotlinを書きましょう

まずは出力先として画面に表示項目を追加します。
res/layout/activity_main.xml
を開いて以下のように編集

![image11.png](https://qiita-image-store.s3.amazonaws.com/0/148354/a4d96d6f-75ff-2e9f-35d0-b7e60e471436.png)


[MainActivity.kt]のonCreateメソッドを編集します。

``` Kotlin
    // Kotlin
    val textView = findViewById(R.id.textView) as TextView
    textView.text = "hogehoge"
```

``` Java
    // Java
    TextView textView = (TextView)findViewById(R.id.textView);
    textView.setText("hogehoge");
```

変数宣言は型推論による静的型付けとなり、Javaのように型を指定する必要はありません。  
キャストもas句のため括弧が減ってすっきり。

valはイミュータブルな変数の宣言となります。
再代入可能な変数はvarです。(ちょっと紛らわしい)

Javaとちがいsetter、getterを明示的に持たずプロパティに自動的にアクセサを介してアクセスします。

ここまでできたら実行してみましょう。

[開発者モード](http://qiita.com/knakamigawa/items/5b8bd2793920b517bf25)ON、USBデバッグモードONにしたAndroid端末を接続します。

緑の三角形を押すと実行画面が開きます。

![image12.png](https://qiita-image-store.s3.amazonaws.com/0/148354/9735a014-3114-b80a-5b2e-267fa6bf4801.png)

![image13.png](https://qiita-image-store.s3.amazonaws.com/0/148354/2e15cff6-fc42-8406-a4f5-3fda18652b31.png)

[Connected Devices]に表示されている端末を選択し[OK]を押すとAndroid端末にアプリがインストールされ、実行されます。

実行するとこのような画面が表示されます。

<img width="369" alt="image14.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/ba551be8-7434-4a96-ec4f-3f074d7a81a9.png">


ボタンを追加してボタンからの操作を受け付けます。

<img width="962" alt="image15.png" src="https://qiita-image-store.s3.amazonaws.com/0/148354/c34a1074-1e03-caa4-d6d0-d6f0b74c4367.png">


``` Kotlin
        // Kotlin
        // onCreate内
        val button = findViewById(R.id.button) as Button
        button.setOnClickListener{
            val textView = findViewById(R.id.textView) as TextView
            textView.text = "click button"
        }
```

``` Java
        // Java
        // onCreate内
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView textView = (TextView)findViewById(R.id.textView);
                textView.setText("click button");
            }
        });
```

ボタンにアクションを設定するにもKotlinだとすごくシンプルにかける。

関数を変数に代入して実行も可能。

``` Kotlin
    // Kotlin
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView = findViewById(R.id.textView) as TextView
        textView.text = "hogehoge"

        val button = findViewById(R.id.button) as Button
        button.setOnClickListener{  onClickButton() }
    }
    
    val onClickButton = {
        val textView = findViewById(R.id.textView) as TextView
        textView.text = "click button"
    }
```

# 結び

本当に導入だけ、さわりだけなのですが関数型で今時な書き方ができる「Kotlinを使ってAndroidの開発を始めてみる」でした。

Swiftからの移植性の高さ、コーディング量の削減などメリットは多いですが。
Android書くときのつらいOverride地獄から抜け出せるというだけでも個人的には感動を禁じ得ません。


今までJavaはなーということでAndroidの開発を敬遠していた方にはぜひ1度お試し頂ければと思います。


私の次の担当日はReact + Reduxによるフォーム実装の知見について書く予定です。
そちらも是非よろしくお願いします。

---

明日は弊社エンジニア @kai-zoa の「Drone.ioのOSS版をAWS ECSに構築（ALB+SSL）」です。

# ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/69257)しております。