メインからサブ画面にオブジェクトを渡すときの方法
画面遷移の際に値を渡すのは書籍やネットにもよくあります。しかしオブジェクトになると、
あるにはあるがjavaであったり古かったので今回備忘録として残します。
まずオブジェクトはそのまま渡すことはできないので、シリアライズという方法を使う必要がある。
このシリアライズはオブジェクトを一旦バイト列にし、遷移先で再度オブジェクトにするという手段。
シリアライズを実装するにあたり以下のどれかを使う。
1,Serializable
2,Parcelable
3,@Parcelize
私が選択したのは@Parcelize
今回はメイン画面で値を入力したものを処理するクラスに渡しデータクラスの型にして
戻り値でメイン画面に戻し、サブ画面に遷移する流れでやります。
まずはbuild.gradle(:app)にプラグインを追加
//parcelize
id 'kotlin-parcelize'
データクラスを作成し@Parcelizeの追加と継承でParcelableを入れる
@Parcelize
data class Info(
val info: Double
) : Parcelable
次にメイン画面の値を処理するクラスを作成する。
class Calculation {
private var num1: Double = 0.0
private var num2: Double = 0.0
private var result: Double = 0.0
//掛け算をする
fun result(num1: String, num2: String ): Info{
this.num1 = num1.toDouble()
this.num2 = num2.toDouble()
result = this.num1 * this.num2
return Info(result)
}
}
}
メイン画面では値を入力したものをCalculationクラスに渡し結果をInfoクラスの型で受けとりオブジェクトとして
画面遷移する
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setContentView(binding.root)
//計算をするクラスをインスタンス化
val calculation = Calculation()
//クリックするとサブアクティビティに移動
binding.measurementButton.setOnClickListener {
val result = calculation.result(
num1 = binding.num1InputForm.text.toString(),
num2 = binding.num2InputForm.text.toString()
)
//Infoクラスをインスタンス化
val info = Info(result)
intent = Intent(this, SubActivity::class.java)
intent.putExtra("RESULT", info)
startActivity(intent)
}
}
}
}
受け取り側のサブクラスでは
class SubActivity : AppCompatActivity() {
private lateinit var binding: ActivitySubBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySubBinding.inflate(layoutInflater)
setContentView(binding.root)
//前画面からBMI数値をもらい、詳細画面に入力
val result = intent.getParcelableExtra<Info>("RESULT")
binding.resultOutput.text = result.Info.toString()
}
}
以上でオブジェクトの画面遷移になります。
@Parcelizeは簡単に実装できるが、実力を上げるためにはSerializable、Parcelableを
使って見たいと思います。