画面回転で苦労した話(原因はわかった)

画面を回転させると、なぜかレイアウトが崩れてしまう。 https://qiita.com/QiitaD/items/7d405e93f39a4a3c9d95 などを参考にさせていただいて、ちゃんと縦用の画面と横用の画面を作って、それぞれ layout と layout-land のフォルダに入れているのに、縦で立ち上げた画面を回転させても横用の画面にならず、縦用のレイアウトを無理やり横に合わせた形になってしまう。その逆も同じ。横で立ち上げた画面を縦にするときもうまくいかない。つまり、レイアウトの切り替えをやってくれないのである。その理由がわからず、ずいぶん悩んだ。

今度やっとその原因がわかったのだが、画面回転を検知するための設定に問題があった。具体的には、マニフェストの当該Activityに "android:configChanges="orientation|screenSize" を追記したとき、この問題が起きるようだ。


原因はわかったがまだ問題は残る。上記の追記は画面回転を検知するためには必要。
今回は、アプリの立ち上げ時にメッセージを出すにあたって、画面回転するたびに同じメッセージが出てはうるさいので、回転の後すぐはそれが出ないようにするために、この機能を使っていたのだった。
しかしこれをやると、画面のレイアウトが崩れてしまう・・・この両立をする方法はないのか。

(ちなみに、無理やり縦用と横用のレイアウトに違う名前を付けて、アクティビティ上で画面の向きを検知して 、 縦の時はsetContentView(縦用レイアウト)、横の時はsetContentView(横用レイアウト)としてみたが、 やはりレイアウトは切りかわらなかった。)


参考までに、画面回転の検知には、上記の追加を行ったうえで、以下のようなコードを AppCompatActivityの中に書く。この場合、画面が回転したらsharedPreferenceの"Rotated"がtrueになるので検知できる。
override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        val sharedPref = getSharedPreferences("sharedPref", MODE_PRIVATE)
        sharedPref.edit().putBoolean("Rotated",true).apply()
    }
    

画面回転を検知する方法については、 https://karat5i.blogspot.com/2014/11/blog-post_16.html https://karat5i.blogspot.com/2014/11/blog-post_16.html などを参考にさせていただきました。

なお、画面の向きを検知するだけなら、マニフェストに追記の必要はなく、上記の問題を回避できるみたいで、 https://qiita.com/niusounds/items/74ade5e5a446869dcc8b にある方法は使える。

コメント

このブログの人気の投稿

目覚まし時計アプリを公開します

超初心者の機械学習入門