LoginSignup
4
8

More than 5 years have passed since last update.

KotlinでAndroidアプリを開発(AnkoでstartActivityを簡潔に!編)

Last updated at Posted at 2017-09-26

検証環境

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

  • 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を簡潔に記述する方法

アプリの内容

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

説明

明示的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を使用する事により、随分簡潔に記述が可能になった。

参考

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8