スキップしてメイン コンテンツに移動

Android 現状の見てる状態の画面回転をロック

Android端末でごちゃごちゃ処理している時に画面を回転させると、onDestroyが呼ばれActivityが再生成されて面倒なわけですが、ちょっとした処理を待たせるような時はActivity再生成の対策を考えるよりは画面を固定してしまった方が面倒なことも少ない。というわけで、ググってみるとあまりコレだ!という感じのがなかなか出てこないのでメモしておきます。

まあ、(たぶん)昔の端末は画面の回転は縦か横かだったのが、最近のは画面の向きに即して4パターン変る仕様になったのと & ユーザ側で画面をロックしたいなどのアプリ利用でのノウハウもあってすぐに出てこないと言った感じでしょうか。

こちらに、ありがたいメソッドがあるのですが、
・Androidで回転を固定にしたり解除したりする方法について : 新・開発者の戯言
http://blog2.kojin.biz/2010/04/23/androidで回転を固定にしたり解除したりする方法につ/
 これは、縦か横かの固定なので、Android 2.1と2.3とかの端末だとうまく行くのですが、Nexus 7とかを逆の縦(逆の横)に向けておいて、このメソッドを走らせると画面がくるんと回って固定されてしまうわけです。そして解除するとくるんと元に戻る。

そういうのもひっくるめていいやり方がありました。
・How to Lock screen orientation when displaying reverse landscape in android? - Stack Overflow
http://stackoverflow.com/questions/6410237/how-to-lock-screen-orientation-when-displaying-reverse-landscape-in-android
autremoiさんの回答でlockScreenOrientation()のメソッド。4パターン判定して固定しています。Surface.ROTATION_180とSurface.ROTATION_270に直接値が入ってますが、これはSCREEN_ORIENTATION_REVERSE_PORTRAITとSCREEN_ORIENTATION_REVERSE_LANDSCAPEがAPI Level 9以上であることから、それ以前用に向けてのことです。
・ActivityInfo | Android Developers
http://developer.android.com/reference/android/content/pm/ActivityInfo.html#SCREEN_ORIENTATION_REVERSE_LANDSCAPE
まあ、そもそもSurface.ROTATION_180にSurface.ROTATION_270入らないので大丈夫のような気がしなくもないですが。

上記2つのメソッドから使い回しできるようstaticメソッドに書き換えたのを載せておきます。

    /**
     * 画面の回転を固定・解除する関数
     * @param flg 真なら回転固定 偽なら回転可能
     */
    public static void lockScreenOrientation(Activity activity, Boolean flg){
        if(flg){
            switch (((WindowManager) activity.getSystemService(Activity.WINDOW_SERVICE))
                    .getDefaultDisplay().getRotation()) {
            case Surface.ROTATION_90:
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            case Surface.ROTATION_180:
                activity.setRequestedOrientation(9/* reversePortait */);
                break;
            case Surface.ROTATION_270:
                activity.setRequestedOrientation(8/* reverseLandscape */);
                break;
            default :
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }else{
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        }
    }

PR
Androidプログラミングレシピ増補改訂版 アーキテクチャ/UI/ネットワーク編

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。