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など)