LoginSignup
73
60

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-04

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

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

① 縦固定でいいよ派

やること

  • マニフェストの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など)
73
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
60