ユーザ用ツール

サイト用ツール


サイドバー


android:画面の回転をロック_解除

画面の回転をロック、解除する

Androidでダイアログを表示しているときに、画面を回転させたら、Activityが再生成されて、再度ダイアログの描画が実行されるみたい。その結果、ダイアログを閉じてもまだダイアログが残っているという状態になってしまった。

対策としては、ダイアログ表示中に回転させても、ダイアログを再描画しないようにすればよいのだと思うが、ちょっと調べてもやり方が分からない。

そこで、ダイアログを表示している間は、画面を回転しないようにしてしまうことにした。回転させないことでActivityを再生成しないという逃げさ。。。

回転対応のAndroidアプリとして作っているにもかかわらず、回転しないようにする、というのは気が引けるが、取り急ぎの対策が必要なのでしょうがない。(と言い聞かせ)

時間が出来たときに、回転してもダイアログを再描画しないようにする方法を改めて調べることにする。

それで、回転しないようにする方法は、 https://www.takaiwa.net/2013/09/android_19.html を参考にした。

/**
 * 画面の回転を固定・解除する関数
 * @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);
    }
}

そのまま、使わせてもらって、無事解決。

尚、呼ぶ側は以下の通り。

onCreateDialog で回転をロックする

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity());
 
    (中略)
 
    // 画面固定
    lockScreenOrientation(getActivity(), true);
 
    return dialog;
}

onDestroyView でロック解除する

@Override
public void onDestroyView() {
    super.onDestroyView();
    // 画面固定解除
    lockScreenOrientation(getActivity(), false);
}

これで、このダイアログが表示されている間だけ、回転をロックすることが出来た。

投稿日 : 2015/12/08

android/画面の回転をロック_解除.txt · 最終更新: 2020/05/05 01:40 by hohog

ページ用ツール