色んな派閥があるのでまとめた。
※事例は実機で回転させた挙動からの推測。②は実は③のケースもあるかも。
① 縦固定でいいよ派
やること
- マニフェストのActivityに以下を足すだけ
AndroidManifest.xml
android:screenOrientation="portrait"
利点
- 実装も楽だし、検証も楽。
欠点
- 横持ちで操作したいユーザーに不親切
- Android Nからマルチウィンドウがあるので、マルチウィンドウ対応をするなら結局画面の高さが短いケースは対応が必要
-
ScrollView
でラップするなど
-
事例
- Airbnb, Uber
② 回転は許容するがActivityは再生成しないよ派
やること
configChanges
を指定する。これで回転時にActivityが破棄されなくなり、代わりにonConfigurationChanged
が呼ばれるようになる。
AndroidManifest.xml
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|screenSize|orientation"/>
画面はlandscapeでも表示できるように、大抵の人はレイアウトをScrollView
でラップしてるのではないだろうか。
利点
- まあまあ楽。
- 一応横持ちでも使える。
欠点
- 縦横で見た目の変わるビューの見た目は切り替わらない
- 例
- Toolbarは縦横でフォントの大きさが違うが、この方法だと回転時に切り替わってくれない
- 例
- 一部のUIライブラリは回転時にサイズ調整が上手く動かない
- 例
- Percent libraryでビューのwidthを画面の横幅、heightを横幅をベースにアスペクト比を指定してサイズを決めている場合、回転時にheightが新しいwidthにもとづいて更新されない
- ConstraintLayoutなら調整される
- Percent libraryでビューのwidthを画面の横幅、heightを横幅をベースにアスペクト比を指定してサイズを決めている場合、回転時にheightが新しいwidthにもとづいて更新されない
- 例
事例
- Twitter, Evernote, LinkedIn
③ 回転は許容するし、Activityも再生成するよ派
やること
- Activityが破棄されて再生成されるので、回転の前後で状態をどうやって渡すかが肝になる。
- 状態が渡せないと、ユーザーが入力中のテキストが消えたり、APIリクエストが中断されたりする
- 状態を保持する方法は色々ある
利点
- 各ビューの見た目が回転時に調整されるので、UIが良くなる。
- 縦横でレイアウトを切り替えられる
-
layout
とlayout-land
にそれぞれのレイアウトを用意する
-
欠点
- かなりめんどくさい。
- 非同期処理(サーバーのAPIを叩くなど)の途中で回転が挟まった場合、どうするか?など。
- Activityのライフサイクルより長いライフサイクルで管理する必要がある。Architecture componentのViewModelはまさにこのためにある。
- 非同期処理(サーバーのAPIを叩くなど)の途中で回転が挟まった場合、どうするか?など。
- UIライブラリが回転時に状態を保持してくれるかは実装次第。
- onSavedInstanceState / onRestoreInstanceStateで保存/復元してくれてればOK
事例
- Googleの各アプリ(Gmail, YouTubeなど)