【Kotlin/Android Studio】Bundleとは?データの保存とsavedInstanceState

この記事からわかること

  • Android Studio/KotlinBundleクラス実装方法
  • savedInstanceState使い方
  • ActivityFragment間でデータ受け渡す方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:SimpleOnItemTouchListener

環境

Bundleとは?

BundleとはAndroidでデータを格納する入れ物として用意されているコンテナです。保存するデータはキーと値がペアで管理されており、Activity間やFragment間でのデータの受け渡しに利用されることが多いです。ActivityではIntentクラスの内部でBundleが使用されています。

Bundleとは「束ねる」や「包みにする」といった意味を持つ英単語であり、その言葉通りAndroidにおいてデータを束ねて保管する役割を持っています。

savedInstanceState

Bundleが使用されている箇所としてActivityやFragmentなどの再生成時のデータ保持に利用されています。Androidの画面ではデバイス画面の回転時やバックスタックからの戻り時などActivityやFragmentなどが再生成されるタイミングが多いです。その際にデータが消失してしまわないようにsavedInstanceStateというBundleを使用したデータ保存の仕組みが用意されています。

破棄される前に呼ばれるonSaveInstanceStateメソッド内でBundle内に格納し、再生成時に呼ばれるonRestoreInstanceStateメソッド内やonCreateメソッド内で保存したデータを参照することが可能になっています。


override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    // 保存したいデータをBundleに格納
    outState.putString("key", "Hello, savedInstanceState!")
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    // 保存されたデータを取り出す
    val value = savedInstanceState.getString("key")
    Toast.makeText(this,value.toString(),Toast.LENGTH_LONG)
        .show()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (savedInstanceState != null) {
        val value = savedInstanceState.getString("key")
    }
}

Bundleクラスの使い方

Bundleクラスはキーと値でデータを保管する入れ物でした。使用するにはまずBundleインスタンスを生成します。生成したインスタンス内にデータを格納するにはputXXXXXメソッドを使用します。


val bundle = Bundle()
bundle.putString("key", "Hello World!")
bundle.putInt("intKey", 42)
bundle.putBoolean("boolKey", true)
bundle.putDouble("doubleKey", 3.14)

例えばFragmentにデータを渡したい場合はFragmentのargumentsにBundleを渡します。あとはそのまま遷移させます。


val fragment = SecondFragment()
fragment.arguments = bundle

val button: Button = view.findViewById(R.id.button2)
button.setOnClickListener {
    parentFragmentManager.beginTransaction().apply {
        add(R.id.main_frame,fragment)
            .addToBackStack(null)
            .commit()
    }
}

遷移先となる「SecondFragment」ではgetXXXXXメソッドを使用してデータを取得します。


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val str = arguments?.getString("key")
    val int = arguments?.getInt("intKey")
    val bool = arguments?.getBoolean("boolKey")
    val double = arguments?.getDouble("doubleKey")
    Toast.makeText(this.requireContext(),str.toString(),Toast.LENGTH_LONG)
        .show()
    Toast.makeText(this.requireContext(),int.toString(),Toast.LENGTH_LONG)
        .show()
    Toast.makeText(this.requireContext(),bool.toString(),Toast.LENGTH_LONG)
        .show()
    Toast.makeText(this.requireContext(),double.toString(),Toast.LENGTH_LONG)
        .show()
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index