Android Studioを使うと簡単です。
Androidではアクティビティ間でクラスをやりとりしたり、アクティビティの再生成でデータが破棄されないように保存しておくためにクラスの状態を保存しておくことができる。その仕組みがParcelableで、ごく簡単に言うと状態を保存したいクラスにParcelableインターフェースを継承してあげればいい。 あとは通常の変数のようにbundleに保存することができる。
ではParcelableを実装する方法。
まずは適当なクラスをParcelableを継承して作る。
すると、こんな風に勝手にコードを生成してくれる。
詳しくはコメントを読んで欲しい。
今回はボタンをクリックするたびに+1するアプリケーション。画面回転時にアクティビティが再生成されても数字はリセットされない。
Androidではアクティビティ間でクラスをやりとりしたり、アクティビティの再生成でデータが破棄されないように保存しておくためにクラスの状態を保存しておくことができる。その仕組みがParcelableで、ごく簡単に言うと状態を保存したいクラスにParcelableインターフェースを継承してあげればいい。 あとは通常の変数のようにbundleに保存することができる。
ではParcelableを実装する方法。
まずは適当なクラスをParcelableを継承して作る。
class TestParcelable():Parcelable {
}
そしてクラス名の上にカーソルを乗せてalt+Enterを押すと、メニューにadd Parcelable Implementationというメニューがあるので実行する。すると、こんな風に勝手にコードを生成してくれる。
class TestParcelable() : Parcelable {
constructor(parcel: Parcel) : this() {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<TestParcelable> {
override fun createFromParcel(parcel: Parcel): TestParcelable {
return TestParcelable(parcel)
}
override fun newArray(size: Int): Array<TestParcelable?> {
return arrayOfNulls(size)
}
}
}
ここに保存したいメンバ変数を記述して、保存と復元の部分を記述してあげればいい。今回は数値を一つだけ格納するクラスを作った。詳しくはコメントを読んで欲しい。
class TestParcelable() : Parcelable {
//今回の保存する変数
var count: Int = 0
constructor(parcel: Parcel) : this() {
//保存されているデータを復元する処理
//保存された順番で読み出しされる
count = parcel.readInt()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
//変数の内容を保存する処理
parcel.writeInt(count)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<TestParcelable> {
override fun createFromParcel(parcel: Parcel): TestParcelable {
return TestParcelable(parcel)
}
override fun newArray(size: Int): Array<TestParcelable?> {
return arrayOfNulls(size)
}
}
}
あとは通常どおりにbundleで保存と復元をしてあげればいい。今回はボタンをクリックするたびに+1するアプリケーション。画面回転時にアクティビティが再生成されても数字はリセットされない。
class MainActivity : AppCompatActivity() {
private lateinit var testParcelable: TestParcelable
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//保存されているクラスがあれば保存したときのidで復元する
//nullだったらインスタンスを生成する
testParcelable = savedInstanceState?.getParcelable<TestParcelable>("test") ?: TestParcelable()
textView.text = testParcelable.count.toString()
//ボタンをクリックするたびに+1してtextViewに表示する
button.setOnClickListener {
textView.text = (++testParcelable.count).toString()
}
}
//アクティビティが破棄される状態になると呼び出される
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
//testというidでparcelableを継承したクラスを保存する
outState?.putParcelable("test", testParcelable)
}
}