あなたのインナーチャイルド、今日も元気?
カツドンチャンネルで好きな動画置いときますね
本題
画面回転する→onSaveInstanceState()→onDestroy()→onCreate()という感じ(超省略)でふりだしに戻ります。
つくる
ScreenRotationFragment.kt / fragment_screen_roration.xml
今回はFragmentでの値の引き継ぎですのでまずFragment作ります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical">
<EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" android:text="Name" /> </LinearLayout>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class ScreenRotationFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_screen_roration, container, false) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (savedInstanceState != null) { editText.setText(savedInstanceState.getString("text")) } }
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.apply { putString("text", editText.text.toString()) } }
}
|
MainActivity.kt / activity_main.xml
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".MainActivity">
</LinearLayout>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
val fragment = if (supportFragmentManager.findFragmentByTag("rotation_fragment") != null) { supportFragmentManager.findFragmentByTag("rotation_fragment") as ScreenRotationFragment } else { ScreenRotationFragment() } supportFragmentManager .beginTransaction() .replace(R.id.activity_main_fragment, fragment, "rotation_fragment") .commit()
} }
|
これで実行してEditTextにテキスト入れて画面回転してもなんと!値が復元されてるんですね~
データクラスのときは?
複数の値をまとめたデータクラスのときはどうやって引き継ぐのかって話ですがSerializable
ってのを使うそうですよ?
データクラスつくる
TestData.kt
1 2 3
| data class TestData( val text: String ) : Serializable
|
Serializable
ってのを使います
Fragment書き換え
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class ScreenRotationFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_screen_roration, container, false) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (savedInstanceState != null) { val testData = savedInstanceState.getSerializable("data") as TestData editText.setText(testData.text) } }
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.apply { val testData = TestData(editText.text.toString()) putSerializable("data", testData) } }
}
|
これでも値が復元されるはずです。
終わりに
Serializable
ともう一個、Parcelable
ってのが有るんだけどなんか実装がだるい(IDEがやってくれるけど)ので今回は見送った。
別に今回のような使い方ならSerializable
で十分だと思う。