0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

kotlinでオブジェクトを画面遷移で渡す【@Parcelize】

Last updated at Posted at 2022-01-20

メインからサブ画面にオブジェクトを渡すときの方法

画面遷移の際に値を渡すのは書籍やネットにもよくあります。しかしオブジェクトになると、
あるにはあるがjavaであったり古かったので今回備忘録として残します。

まずオブジェクトはそのまま渡すことはできないので、シリアライズという方法を使う必要がある。
このシリアライズはオブジェクトを一旦バイト列にし、遷移先で再度オブジェクトにするという手段。

シリアライズを実装するにあたり以下のどれかを使う。
1,Serializable
2,Parcelable
3,@Parcelize

私が選択したのは@Parcelize
今回はメイン画面で値を入力したものを処理するクラスに渡しデータクラスの型にして
戻り値でメイン画面に戻し、サブ画面に遷移する流れでやります。

まずはbuild.gradle(:app)にプラグインを追加

build.gradle
    //parcelize
    id 'kotlin-parcelize'

データクラスを作成し@Parcelizeの追加と継承でParcelableを入れる

Info.kt
@Parcelize
data class Info(
    val info: Double
    ) : Parcelable

次にメイン画面の値を処理するクラスを作成する。

Calculation.kt
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クラスの型で受けとりオブジェクトとして
画面遷移する

MainActivity.kt
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)
            }
        }
    }
}

受け取り側のサブクラスでは

SubActivity.kt
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を
使って見たいと思います。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?