WindowSizeClassの取得方法について
みなさんこんにちは、DX推進本部/プロダクト開発統括1部、新卒1年目の彌永です。現在Androidエンジニアの研修を受けています。
さて私からは、アダプティブレイアウトを実装する際に大体の方がお世話になっているであろう WindowSizeClass の取得方法について紹介していきます!
この記事を作成するに至った経緯
Codelab(※1)でアダプティブレイアウトについて学んだ際、アプリの画面サイズを取得するために calculateWindowSizeClass() を使っていたのですが、後日使い方を思い出そうとしても殆ど覚えていなかったということもあり、改めて検索したところ、currentWindowAdaptiveInfo() という関数に出会いました。それを使用しているサンプルコード(※2)を確認したところ、アダプティブレイアウトを実装するために利用する関数であることがわかりました。
そこで、calculateWindowSizeClass() と currentWindowAdaptiveInfo() との使い分けをどのように行うべきなのか気になったので、追加で調査することにしました!
前提
calculateWindowSizeClass() と currentWindowAdaptiveInfo() は、どちらも返り値の型がWindowSizeClassであるが、パッケージの異なる別クラスである
calculateWindowSizeClass() の動作
この関数の引数 activity には Activity を与える必要がある
WindowSizeClass の WindowWidthSizeClass または WindowHeightSizeClass を用いることでアダプティブレイアウトを実現できる
Expanded 、Medium 、Compact が取得可能(パスカルケース)
現在は、OptIn アノテーションに ExperimentalMaterial3WindowSizeClassApi を指定しなければならない
コード例
ライブラリは、androidx.compose.material3:material3-window-size-class:1.3.1 を使用
今回は WindowWidthSizeClass を使っているが、WindowHeightSizeClass でも同様の実装が可能
val windowSize: WindowSizeClass = calculateWindowSizeClass(activity = activity)
// windowSize.widthSizeClass は WindowWidthSizeClass という value class である
val currentWindowSize = when (windowSize.widthSizeClass) {
WindowWidthSizeClass.Expanded -> "Expanded"
WindowWidthSizeClass.Medium -> "Medium"
WindowWidthSizeClass.Compact -> "Compact"
else -> "Unknown"
}currentWindowAdaptiveInfo()の動作
厳密には WindowAdaptiveInfo を取得する関数であり、その中に WindowSizeClass が含まれている
WindowSizeClass の WindowWidthSizeClass または WindowHeightSizeClass を用いることでアダプティブレイアウトを実現できる
EXPANDED 、MEDIUM 、COMPACT が取得可能(アッパーケース)
現時点で、WindowWidthSizeClass または WindowHeightSizeClass を用いた条件分岐含め、WindowSizeClass で用意されている多くの関数が deprecated になっているため、アダプティブレイアウトを実現するための値取得方法が置き換わる可能性を感じている
コード例
ライブラリは androidx.window:window:1.3.0 を使用
今回は WindowWidthSizeClass を使っているが、WindowHeightSizeClass でも同様の実装が可能
val windowSize: WindowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
// windowSize.widthSizeClass は WindowWidthSizeClass という class である
val currentWindowSize = when (windowSize.widthSizeClass) {
WindowWidthSizeClass.EXPANDED -> "Expanded"
WindowWidthSizeClass.MEDIUM -> "Medium"
WindowWidthSizeClass.COMPACT -> "Compact"
else -> "Unknown"
}結論
calculateWindowSizeClass() と currentWindowAdaptiveInfo() はどちらを利用してもアダプティブレイアウトを実現することは可能
currentWindowAdaptiveInfo() では WindowSizeClass 以外に Posture も取得できるため、そちらを利用する目的があれば currentWindowAdaptiveInfo() を、そうでなければ、WindowWidthSizeClass または WindowHeightSizeClass を用いた条件分岐が deprecated になっていない calculateWindowSizeClass() を利用する、といった使い分けができそう
調査を行っての所感
私は今回の調査を通して、「公式ドキュメントを読む重要性」や「情報の取捨選択する際の判断軸」について学習できたと感じています。
現在、Androidエンジニアとしての研修を受けており、専門知識や経験がまだ十分でないと感じています。しかし、この研修を終え、実務に入った後は「多くの人から信頼されるAndroidエンジニア」になることを目指します!
[参照]
・calculateWindowSizeClass() - リファレンス
・WindowSizeClass(androidx.compose.material3:material3-window-size-class) - リファレンス
・WindowWidthSizeClass(androidx.compose.material3:material3-window-size-class) - リファレンス
・currentWindowAdaptiveInfo() - リファレンス
・WindowAdaptiveInfo - リファレンス
・WindowSizeClass(androidx.window:window-core) - リファレンス
・WindowWidthSizeClass(androidx.window:window-core) - リファレンス
[注釈]
※1 Codelab
さまざまな画面サイズに適応する | Compose での Android の基礎 - アダプティブ レイアウト | Android Developers
※2 サンプルコード
以下のリンク先に記載がありました
各種の画面サイズのサポート | Jetpack Compose | Android Developers
関連する求人情報