Android

Androidの回転をどう対応するか派閥リスト

More than 1 year has passed since last update.

色んな派閥があるのでまとめた。

※事例は実機で回転させた挙動からの推測。②は実は③のケースもあるかも。

① 縦固定でいいよ派

やること

  • マニフェストの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なら調整される

事例

  • Twitter, Evernote, LinkedIn

③ 回転は許容するし、Activityも再生成するよ派

やること

  • Activityが破棄されて再生成されるので、回転の前後で状態をどうやって渡すかが肝になる。
    • 状態が渡せないと、ユーザーが入力中のテキストが消えたり、APIリクエストが中断されたりする
  • 状態を保持する方法は色々ある
    • onSavedInstanceState / onRestoreInstanceStateで自分で実装する
    • Icepickを使う
    • setRetainInstance(true)なFragmentを使う
    • Architecture componentのViewModelを使う

利点

  • 各ビューの見た目が回転時に調整されるので、UIが良くなる。
  • 縦横でレイアウトを切り替えられる
    • layoutlayout-landにそれぞれのレイアウトを用意する

欠点

  • かなりめんどくさい。
    • 非同期処理(サーバーのAPIを叩くなど)の途中で回転が挟まった場合、どうするか?など。
      • Activityのライフサイクルより長いライフサイクルで管理する必要がある。Architecture componentのViewModelはまさにこのためにある。
  • UIライブラリが回転時に状態を保持してくれるかは実装次第。
    • onSavedInstanceState / onRestoreInstanceStateで保存/復元してくれてればOK

事例

  • Googleの各アプリ(Gmail, YouTubeなど)