Android
Kotlin
AndroidStudio
anko

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のみを紹介する。これまで記事で提示したソースコードを改良し、その差分だけを示していく。

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

元のソースコード
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)
        })

    }
}
修正後のソースコード
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の型を指定するだけになる。

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

データを渡す例

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

startActivity(vararg params: Pair<String, Any>)

今回は1つしかデータを渡さないので配列やArrayにはしていない。
結果的に下記のようになる。

Ankoを使わない場合
startActivity(Intent(this, ResultActivity::class.java).apply {
            putExtra("PersonalData", data)
})
Ankoを使った場合
startActivity<ResultActivity>("PersonalData" to  data)

まとめ

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

参考

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