KotlinでAndroidアプリを開発（AnkoでstartActivityを簡潔に！編）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Java:open jdk 1.8.0_152
* Android Studio 3.0 Beta 2
* CompileSdkVersion:26
* MinSdkVersion:19
* TargetSdkVersion:26
* BuildToolsVersion:26.0.1
* Anko SQL:0.10.1

# 目標
以下の内容を理解する

* AnkoのcommonsにあるIntentの活用方法
* startActivityを簡潔に記述する方法

# アプリの内容

下記の記事で記述した内容を今回は改善するため、アプリの動きに変化はなし

https://qiita.com/naoi/items/6e6152c90c4219bbb055

# 説明
明示的Intentを使った画面遷移や暗黙的Intentを使用した起動は、AnkoのCommonsを使用すると簡潔に記述可能。
今回は明示的Intentのみを紹介する。これまで記事で提示したソースコードを改良し、その差分だけを示していく。

# ソースコードの全体的な差分

```kotlin:元のソースコード
package jp.co.casareal.sample.bmisample

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.view.View
import jp.co.casareal.sample.bmisample.entity.PersonalData
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {


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

    fun onClickBMIList(view: View) = startActivity(Intent(baseContext,BMIListActivity::class.java))


    fun onClickCalcButton(view: View) {

        val tall = editTextTall.text.toString().toDoubleOrNull()
        val weight = editTextWeight.text.toString().toDoubleOrNull()

        if (tall == null || weight == null) {

            AlertDialog.Builder(this).setTitle(R.string.dialog_title_invalid_input).setPositiveButton(android.R.string.ok, null).show()
            return
        }

        val data = PersonalData(tall, weight)

        startActivity(Intent(this, ResultActivity::class.java).apply {
            putExtra("PersonalData", data)
        })

    }
}
```


```kotlin:修正後のソースコード
package jp.co.casareal.sample.bmisample

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.view.View
import jp.co.casareal.sample.bmisample.entity.PersonalData
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.startActivity

class MainActivity : AppCompatActivity() {


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

    fun onClickBMIList(view: View) = startActivity<BMIListActivity>()


    fun onClickCalcButton(view: View) {

        val tall = editTextTall.text.toString().toDoubleOrNull()
        val weight = editTextWeight.text.toString().toDoubleOrNull()

        if (tall == null || weight == null) {

            AlertDialog.Builder(this).setTitle(R.string.dialog_title_invalid_input).setPositiveButton(android.R.string.ok, null).show()
            return
        }

        val data = PersonalData(tall, weight)

        startActivity<ResultActivity>("PersonalData" to  data)


    }
}

```

# 注目すべき差分

## データを渡さない例

Ankoを使用する事によりstartActivityメソッドにジェネリクスで遷移するActitvityの型を指定するだけになる。

```kotlin:Ankoを使わない場合
  fun onClickBMIList(view: View) = startActivity(Intent(baseContext,BMIListActivity::class.java))
```

```kotlin:Ankoを使った場合
    fun onClickBMIList(view: View) = startActivity<BMIListActivity>()

```

## データを渡す例

先ほどと同じように、Ankoを使用する事によりstartActivityメソッドにジェネリクスで遷移するActitvityの型を指定するだけになる。
データを渡すときは、startActivityの引数にPairで渡す形となる。
シグネチャーは下記の通り

```kotlin
startActivity(vararg params: Pair<String, Any>)
```
今回は１つしかデータを渡さないので配列やArrayにはしていない。
結果的に下記のようになる。

```kotlin:Ankoを使わない場合
startActivity(Intent(this, ResultActivity::class.java).apply {
            putExtra("PersonalData", data)
})
```


```kotlin:Ankoを使った場合
startActivity<ResultActivity>("PersonalData" to  data)
```

# まとめ
AnkoのCommonsのIntentを使用する事により、随分簡潔に記述が可能になった。

# 参考

https://github.com/Kotlin/anko/wiki/Anko-Commons-%E2%80%93-Intents