検証環境
この記事の内容は、以下の環境で検証しました。
- 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を使用する事により、随分簡潔に記述が可能になった。