この記事について
Android N のマルチウインドウ環境で、ウインドウサイズを取得するとどのような値が返ってくるかについて説明します。
具体的には次の API の返す値を調査しました。
- getActivity().getWindowManager().getDefaultDisplay().getSize(out);
- 以下、Display.getSize() と記載します。
- getActivity().getWindowManager().getDefaultDisplay().getRealSize(out);
- 以下、Display.getRealSize() と記載します。
これらの API Reference は次の通りです。
結論
- Display.getSize()
- マルチウインドウ状況に応じたウインドウサイズが取得できる
- 非マルチウインドウではステータスバーのサイズが含まれている一方、マルチウインドウ状況ではこれが含まれない
- Display.getRealSize()
- マルチウインドウ状況に影響をうけず端末のディスプレイサイズが取得できる
条件
環境
- 機種:Nexus 6P
- OS:Android 7.1.1
- 端末のディスプレイサイズ:2560 x 1440
コード
それぞれの API の値を画面に表示するアプリを作りました。
https://github.com/hshiozawa/MultiWindowLifecycleTester
表示部分のコードは次の Java ファイル内にあります。
https://github.com/hshiozawa/MultiWindowLifecycleTester/blob/master/app/src/main/java/com/hjm/multiwindowtester/fragment/BaseFragment.java
補足
マルチウインドウ状況でのこれらの値を取得するためには、onMultiWindowModeChanged() で値を取得したほうがよさそうです。通常の Fragment のライフルサイクル上では、マルチウインドウの状況が正しく取得出来ないケースがあります。
ref: https://commonsware.com/blog/2016/06/07/isinmultiwindowmode-race-condition.html
結果
非マルチウインドウ環境
ポートレイト
非マルチウインドウのポートレイトでは各 API のサイズは次のようになりました。
- getSize():w=1440, h=2392(赤枠)
- getRealSize(), w=1440, h=2560(緑枠)
ランドスケープ
非マルチウインドウのランドスケープでは各 API のサイズは次のようになりました。
- getSize():w=2392, h=1440(赤枠)
- getRealSize(), w=2560, h=1440(緑枠)
マルチウインドウ環境
ポートレイト・ウインドウ上部
マルチウインドウのポートレイトで、上部にウインドウを表示した場合、各 API のサイズは次のようになりました。
- getSize():w=1439, h=1134(赤枠)
- getRealSize(), w=1440, h=2560(緑枠)
ポートレイト・ウインドウ下部
マルチウインドウのポートレイトで、下部にウインドウを表示した場合、各 API のサイズは次のようになりました。
- getSize():w=1439, h=1134(赤枠)
- getRealSize(), w=1440, h=2560(緑枠)
ランドスケープ・ウインドウ右側
マルチウインドウのランドスケープで、右側にウインドウを表示した場合、各 API のサイズは次のようになりました。
- getSize():w=1176, h=1355(赤枠)
- getRealSize(), w=2560, h=1440(緑枠)
ランドスケープ・ウインドウ左側
マルチウインドウのランドスケープで、左側にウインドウを表示した場合、各 API のサイズは次のようになりました。
- getSize():w=1176, h=1355(赤枠)
- getRealSize(), w=2560, h=1440(緑枠)