この記事は Jon Eckenrode による Android Developers Blog の記事 " What’s new in WindowManager 1.1.0-beta01 " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Jetpack WindowManager の 1.1.0-beta01 リリースでは、バージョン 1.1.0 の安定版に向けた作業が着々と進んでいます。今回のベータ版にはさまざまな新機能を追加しており、さっそく2023 年 4 月 3 日よりテストや早期利用ができるようになりました。
WindowManager が最適に動作するには、皆さんのフィードバックが必要です。アプリに 1.1.0-beta01 への依存関係を追加し、(すでにこのライブラリ以前のバージョンを使っている場合は)後述する移行手順に従ってください。そして、ぜひ感想をお聞かせください!
androidx.window.embedding
アクティビティの埋め込みを使うと、マルチアクティビティ アプリを大画面向けに最適化できます。1.1.0-beta01 リリースでは、API の拡張とリファクタリングが行われているので、タスク ウィンドウの分割を管理する際の柔軟性、機能、制御が向上しています。この機能は 1.0.0 で試験運用版 API として始まりましたが、最終的に 1.1.0 で安定版となります。
マニフェスト設定を追加して、アプリがアクティビティの埋め込みを実装していることをシステムに通知できるようにしました。分割プロパティに注目しやすくするため、SplitController をリファクタリングしました。分割ルール API を RuleController に、アクティビティ埋め込み API を ActivityEmbeddingController に抽出しました。埋め込み要素の分割属性を記述する SplitAttributes クラスを追加しました。アクティビティ埋め込みルールを適用する最低比率を設定する EmbeddingAspectRatio クラスを追加しました。ピクセルの単位をディスプレイ非依存ピクセル(dp)に変更しました。分割レイアウトをカスタマイズできるようにしました。デベロッパーがルールを識別、管理しやすくするために、ルールにタグを追加しました。
PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED
boolean 型のプロパティとして、アプリ マニフェストの <application> タグに追加しました。
ActivityEmbeddingController
Activity クラスや ActivityStack クラスに関連するオペレーションに使うクラスを追加しました。
SplitController の API に代わるものとして、isActivityEmbedded() を含めています。
RuleController
EmbeddingRule クラスとそのサブクラスに関連するオペレーションに使うクラスを追加しました。
SplitController の API に代わるものとして、以下の API を含めています。
addRule() — ルールを追加するか、同じタグのルールを更新します。
removeRule() — 登録されているルールのコレクションからルールを削除します。
setRules() — ルールのコレクションを設定します。
clearRules() — 登録されているすべてのルールを削除します。
parseRules() — XML のルール定義からルールを解析します。
SplitAttributes
分割レイアウトを定義するクラスを追加しました。
EmbeddingAspectRatio
ディスプレイのアスペクト比に関連する列挙型に似た動作定数を定義するクラスを追加しました。どの場合に分割を有効化するかを、親ウィンドウのアスペクト比に基づいて指定できます。
この定数を使うプロパティについては、SplitRule をご覧ください。
EmbeddingRule
分割ルールを識別するためのタグ項目を追加しました。
SplitController
API をリファクタリングし、次のモジュールに分割しました。
isActivityEmbedded() を ActivityEmbeddingController に移動しました。
次の API を削除し、その機能を RuleController API で置き換えました。
clearRegisteredRules()
getSplitRules()
initialize()
registerRule()
unregisterRule()
isSplitSupported() メソッドを非推奨とし、splitSupportStatus プロパティで置き換えました。これにより、分割機能が利用できない理由について、さらに詳しい情報を提供できるようになります。
getInstance() メソッドに Context パラメータが追加されました。 注 : ActivityEmbeddingController と RuleController の getInstance() メソッドにも、Context パラメータが追加されています。
分割レイアウトをカスタマイズするための SplitAttributes の計算関数を追加しました。
setSplitAttributesCalculator()
clearSplitAttributesCalculator()
isSplitAttributesCalculatorSupported() は、デバイスで SplitAttributesCalculator API がサポートされているかを確認します。
splitSupportStatus プロパティで使う状態定数を提供するために、SplitSupportStatus ネストクラスを定義しました。現在のアプリ環境でアクティビティ埋め込みの分割がサポートされているかどうかに応じて、アプリの動作を変えることができるようになります。
SplitRule
分割のデフォルト レイアウトを定義する defaultSplitAttributes プロパティを追加しました。これは splitRatio と layoutDirection に代わるものとなります。
XML プロパティ splitRatio と splitLayoutDirection が defaultSplitAttributes に変換されるようにしました。
最低の長さの定義に、ピクセルではなく密度非依存ピクセル (dp) を使うように変更しました。
minWidth を minWidthDp に変更し、デフォルト値を 600dp としました。
minSmallestWidth を minSmallestWidthDp に変更し、デフォルト値を 600dp としました。
minHeightDp プロパティを追加し、デフォルト値を 600dp としました。
maxAspectRatioInHorizontal を追加し、デフォルト値を ALWAYS_ALLOW としました。
maxAspectRatioInPortrait を追加し、デフォルト値を 1.4 としました。
完了動作定数に代わる FinishBehavior ネストクラスを定義しました。
このプロパティの変更を、SplitPairRule と SplitPlaceholderRule の Builder ネストクラスに適用しました。
SplitInfo
getSplitRatio() を getSplitAttributes() で置き換え、分割関連の追加情報を提供できるようにしました。
androidx.window.layout
ウィンドウ レイアウト ライブラリを使うと、アプリのディスプレイ ウィンドウの特性を決定できます。1.1.0-beta01 リリースでは、アクティビティ以外のコンテキストを扱えるようになります。
WindowInfoTracker
試験運用版として、アクティビティ以外の UI コンテキストに対応しました。
WindowMetricsCalculator
アクティビティ以外の UI コンテキストに対応しました。
以下の手順を実行し、アプリを以前のアルファ版からアップグレードしてください。アップグレード プロセスをさらに簡単にする方法についてアイデアがある方は、ぜひお知らせください。
アクティビティの埋め込みを有効にするには、次のようにしてこのプロパティをアプリ マニフェストの <application> タグに追加する必要があります。
< property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED" android:value="true" />
このプロパティを true に設定すると、システムは早い段階でアプリの分割動作を最適化します。
現在の分割がスタックに登録されているかどうかを確認します。
SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.ExpandContainersSplitType
現在の比率を確認します。
if (SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.RatioSplitType) { val ratio = splitInfo.splitAttributes.splitType.ratio } else { // 他のタイプの場合、ratio には意味がない。 }
SplitController.getInstance()
次のように変更します。
SplitController.getInstance(Context)
SplitController.initialize(Context, @ResId int)
RuleController.getInstance(Context) .setRules(RuleController.parse(Context, @ResId int))
SplitController.getInstance().isActivityEmbedded(Activity)
ActivityEmbeddingController.getInstance(Context) .isActivityEmbedded(Activity)
SplitController.getInstance().registerRule(rule)
RuleController.getInstance(Context).addRule(rule)
SplitController.getInstance().unregisterRule(rule)
RuleController.getInstance(Context).removeRule(rule)
SplitController.getInstance().clearRegisteredRules()
RuleController.getInstance(Context).clearRules()
SplitController.getInstance().getSplitRules()
RuleController.getInstance(Context).getRules()
minWidth を minWidthDp に、minSmallestWidth を minSmallestWidthDp に変更します。
minWidthDp と minSmallestWidthDp の単位に、ピクセルではなく dp を使うようにします。
アプリでは、次のようにして呼び出すことができます。
TypedValue.applyDimension( COMPLEX_UNIT_DIP, minWidthInPixels, resources.displayMetrics )
または、単純に minWithInPixels を displayMetrics#density で割ります。
SplitPairRule.Builder
SplitPairRule.Builder( filters, minWidth, minSmallestWidth )
SplitPairRule.Builder(filters) // minWidthInDp 引数が 600 の場合は省略可能。 .setMinWidthDp(minWidthInDp) // minSmallestWidthInDp 引数が 600 の場合は省略可能。 .setMinSmallestWidthDp(minSmallestWidthInDp)
setLayoutDirection(layoutDirection) and setSplitRatio(ratio)
setDefaultSplitAttributes(SplitAttributes.Builder() .setLayoutDirection(layoutDirection) .setSplitType(SplitAttributes.SplitType.ratio(ratio)) .build() )
setFinishPrimaryWithSecondary と setFinishSecondaryWithPrimary は、列挙型に似た FinishBehavior 定数を受け取るようになります。
SplitRule の移行の詳細をご覧ください。
次のようにすると、
setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW )
縦向きのデバイスで分割表示できます。
SplitPlaceholder.Builder
パラメータは filters と placeholderIntent のみとなります。その他のプロパティはセッターに移動します。
SplitPairRule.Builder の移行の詳細をご覧ください。
setFinishPrimaryWithPlaceholder は、列挙型に似た FinishBehavior 定数を受け取るようになります。
完了動作の移行の詳細をご覧ください。
setLayoutDirection(layoutDirection) と setSplitRatio(ratio)
レイアウトの方向の移行の詳細をご覧ください。
完了動作定数は、FinishBehavior の列挙型に似たクラス定数に移行する必要があります。
FINISH_NEVER を FinishBehavior.NEVER に変更
FINISH_ALWAYS を FinishBehavior.ALWAYS に変更
FINISH_ADJACENT を FinishBehavior.ADJACENT に変更
レイアウトの方向は、SplitAttributes.LayoutDirection に移行する必要があります。
ltr を SplitAttributes.LayoutDirection.LEFT_TO_RIGHT に変更
rtl を SplitAttributes.LayoutDirection.RIGHT_TO_LEFT に変更
locale を SplitAttributes.LayoutDirection.LOCALE に変更
splitRatio を SplitAttributes.SplitType.ratio(splitRatio) に変更
WindowManager を使ってみるには、次のようにしてアプリの settings.gradle か、プロジェクト レベルの build.gradle ファイルに Google Maven リポジトリを追加します。
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
}
その後、次のようにアプリのモジュール レベルの build.gradle ファイルに 1.1.0-beta01 への依存関係を追加します。
dependencies {
implementation 'androidx.window:window:1.1.0-beta01'
. . .
それでは、コーディングをお楽しみください。
Reviewed by Mari Kawanishi - Developer Marketing Manager, Google Play