【Android】Android with Scala 事始め【Scala】


__2014/09/11時点__

タイトル通り。
今ならずいぶん簡単にできますよ～ということをアピールします。
なお私、JavaでのAndroid開発はやったことはありません...。

__※注意__
__利用している[pfn/android-sdk-plugin](https://github.com/pfn/android-sdk-plugin)はバージョンアップが激しいです。情報がすぐに古くなる可能性が有ります。__

__この手法のメリットは、下記です__

* Scalaで書ける（Better Java, OOPxFP）
* sbtによるビルド管理（パッケージの追加など、比較的楽）


#検証環境

* MacOSX 10.9.4
* IntelliJ IDEA 14 EAP(Scalaプラグインインストール済み)
* GenyMotion(エミュレータ）

#事前準備

* android sdk インストール
* sbtインストール

#プロジェクトの作成

* 基本、[ココ](https://github.com/pfn/android-sdk-plugin#usage)の手順に沿って行くだけですが、一応順番に。

##ひな形ファイルの用意

sbtプロジェクトを配置するディレクトリつくって、その配下にsbtプラグインの記述をします。


```shell
$ mkdir [path/to/project]
$ mkdir [path/to/project]/project
$ cd [path/to/project]
$ vi project/plugins.sbt
```

```plugins.sbt
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.3.5")

resolvers += Resolver.sbtPluginRepo("snapshots")

addSbtPlugin("com.hanhuy.sbt" % "sbt-idea" % "1.7.0-SNAPSHOT")
```

↑IntelliJ用のプラグインも入れてます


##コマンドでプロジェクトのひな形作成

sbtコマンドと拡張コマンドで、プロジェクトのひな形を作ります

```shell

$ cd [path/to/project]
$ sbt
#~~~~~sbtコンソールが起動していろいろ入る
> gen-android android-19 com.takudo.hogehoge takudotest

```
gen-androidの引数は

* APIレベル
* パッケージ名
* 名称

の順で↑の例のように渡す。



__※この後 [error] java.lang.NoClassDefFoundError: sbt/Plugins が発生、sbtのバージョンを0.13.5に変更することでエラーが出なくなる__

```project/build.properties
sbt.version=0.13.5
```

##IntelliJ用設定ファイルを作る

```
$ sbt
> gen-idea

```

IntelliJで開いてみる

File > Openからプロジェクトのディレクトリを選択する

![IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/bfdbcf8e-6214-21c7-8584-6d3fe3d57e5b.jpeg "IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg")


##エミュレータで動かしてみる

### sbt でビルド

sbtコンソールでデバッグ用パッケージを作成します。

```
> ~android:package-debug
```
（頭の~でファイルの変更を監視してコンパイルかけてくれるようになります）

### IntelliJ　SDK設定

IntelliJのSDK設定ができていないはずなので、選択します

File　>　ProjectStructure

![Project_Structure.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/97ff3edc-f4cc-db52-9c42-3a1bd9a0cf07.jpeg "Project_Structure.jpg")

![Project_Structure.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/a51b45e0-68da-16e0-ee08-bb7d525af1f7.jpeg "Project_Structure.jpg")

![Project_Structure.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/a8efc9af-76a6-9078-130a-df9b25dd7582.jpeg "Project_Structure.jpg")

### IntelliJデバッグ設定

IntelliJのデバッグのEditConfigurationsで、
下記のようにデバッグ設定を作ります。

![Run_Debug_Configurations.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/7611144a-afcf-213c-fa00-6ec7171015f9.jpeg "Run_Debug_Configurations.jpg")

### デバッグ実行

虫のアイコンをクリックするとデバイス選択画面が出るので、GenyMotionで動かしているエミュレータを選択します。

![Choose_Device.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/86e0c7d3-5006-9791-40b7-0b9c4bc20115.jpeg "Choose_Device.jpg")

おー動いた！

![Genymotion_for_personal_use_-_Google_Nexus_7_-_4_4_2_-_API_19_-_800x1280__800x1280__213dpi__-_192_168_57_100.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/34327bde-f276-515c-a71d-6b88203926e8.jpeg "Genymotion_for_personal_use_-_Google_Nexus_7_-_4_4_2_-_API_19_-_800x1280__800x1280__213dpi__-_192_168_57_100.jpg")

ブレイクポイントでも止まります。

![IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/74509241-4465-de14-d44f-09fef15a3981.jpeg "IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg")

でもまだこれJavaのソースなんで、Scalaで書きます。

#Scalaでソースコード書いてみる

とりあえずデフォルトで出来上がるJavaのMainActivityをそっくりScalaに移植します。

src/main配下に、
src/main/scala/[パッケージ]/MainActivity.scala
を作りましょう。

（Javaのソースコードをコピーして、scalaのファイルに貼り付けると面白いので試してみてください）

scalaのコードはこんなかんじだと思います。

```scala:src/main/scala/[パッケージ]/MainActivity.scala

package [パッケージ]

import android.app.Activity
import android.os.Bundle

class MainActivity extends Activity {
  /** Called when the activity is first created. */
  override def onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
  }
}

```

で、忘れずにjavaのファイルを消しておきましょう
src/main/java/[パッケージ]/MainActivity.java

では虫アイコンからデバッグ開始！

![Genymotion_for_personal_use_-_Google_Nexus_7_-_4_4_2_-_API_19_-_800x1280__800x1280__213dpi__-_192_168_57_100.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/1204ec09-cffa-11a3-4a38-4ef56f8daf55.jpeg "Genymotion_for_personal_use_-_Google_Nexus_7_-_4_4_2_-_API_19_-_800x1280__800x1280__213dpi__-_192_168_57_100.jpg")

ブレークポイントでも止まります。

![IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/0b577360-d5ee-6de9-aa98-801816721e2d.jpeg "IntelliJ_IDEA__Cassiopeia__IU-138_1980_1.jpg")

以上です。

---

Android始めたばかりというのもありますが、Scalaっぽいimmutableな書き方がしづらい場面が多々ある気がしています。
今後進めていく上で、Scalaでの開発上の良いプラクティスがあれば共有したいなと思っています。