サービスに関する最新情報

Jetpack Compose 2026 年 4 月リリースの新機能

所要時間: 6 分
Meghan Mehta さんのプロフィールを表示
Meghan Mehta Android デベロッパー アドボケイト

本日、Jetpack Compose の 4 月 26 日リリースが安定版になりました。このリリースには、コア Compose モジュールのバージョン 1.11(BOM マッピングの全文を参照)、共有要素デバッグツール、トラックパッド イベントなどが含まれています。また、いくつかの試験運用版 API も用意されています。ぜひお試しいただき、フィードバックをお寄せください。

本日のリリースを使用するには、Compose BOM のバージョンを以下にアップグレードしてください。

implementation(platform("androidx.compose:compose-bom:2026.04.01"))

Compose 1.11.0 の変更点

テストでのコルーチンの実行

Compose でのテストのタイミングの処理方法に、大型アップデートが導入されます。Compose 1.10 で発表されたオプトイン期間を経て、v2 テスト API がデフォルトになり、v1 API は非推奨になりました。主な変更点は、デフォルトのテスト ディスパッチャの変更です。v1 API は、コルーチンを直ちに実行する UnconfinedTestDispatcher に依存していましたが、v2 API は StandardTestDispatcher を使用します。つまり、テストでコルーチンが起動されると、キューに入れられ、仮想クロックが進むまで実行されません。

これにより、本番環境の条件をより正確に模倣し、競合状態を効果的に排除して、テストスイートの堅牢性を大幅に向上させ、不安定さを軽減できます。

テストが標準のコルーチンの動作に沿うようにし、将来の互換性の問題を回避するため、テストスイートを移行することを強くおすすめします。API マッピングと一般的な修正については、包括的な移行ガイドをご覧ください。

共有要素の改善とアニメーション ツール

また、共有要素と Modifier.animatedBounds 用の便利なビジュアル デバッグツールも追加しました。ターゲットの境界、アニメーションの軌跡、一致した数など、内部で何が起きているかを正確に把握できるため、遷移が期待どおりに動作しない理由を簡単に特定できます。新しいツールを使用するには、SharedTransitionLayout を LookaheadAnimationVisualDebugging コンポーザブルで囲むだけです。

LookaheadAnimationVisualDebugging(
    overlayColor = Color(0x4AE91E63),
    isEnabled = true,
    multipleMatchesColor = Color.Green,
    isShowKeylabelEnabled = false,
    unmatchedElementColor = Color.Red,
) {
    SharedTransitionLayout {
        CompositionLocalProvider(
            LocalSharedTransitionScope provides this,
        ) {
            // your content
        }
    }
}

トラックパッド イベント

ノートパソコンの内蔵トラックパッド、タブレット用の着脱式トラックパッド、外部 / 仮想トラックパッドなど、トラックパッドの Compose サポートを刷新しました。基本的なトラックパッド イベントは、一般的に PointerType.Mouse イベントと見なされるようになり、マウスとトラックパッドの動作がユーザーの期待に沿うようになります。以前は、これらのトラックパッド イベントは PointerType.Touch の偽のタッチスクリーン指として解釈され、ユーザー エクスペリエンスが混乱していました。たとえば、トラックパッドでクリックしてドラッグすると、選択ではなくスクロールが行われます。Compose の最新リリースでは、これらのイベントのポインタタイプが変更されたため、トラックパッドでのクリックやドラッグでスクロールできなくなりました。

また、API 34 以降でプラットフォームによって認識される、より複雑なトラックパッド ジェスチャー(2 本指のスワイプやピンチなど)のサポートも追加しました。これらのジェスチャーは、Modifier.scrollable や Modifier.transformable などのコンポーネントによって自動的に認識され、トラックパッドでの動作が改善されます。

これらの変更により、組み込みコンポーネント全体でトラックパッドの動作が改善されます。冗長なタッチスロップが削除され、より直感的なドラッグ&ドロップ開始ジェスチャー、テキスト フィールドでのダブルクリックとトリプルクリックによる選択、テキスト フィールドでのデスクトップ スタイルのコンテキスト メニューが追加されます。

トラックパッドの動作をテストするために、performTrackpadInput, を使用した新しいテスト API が用意されています。これにより、トラックパッドで使用したときのアプリの動作を検証できます。カスタム ジェスチャー検出機能がある場合は、タッチスクリーン、マウス、トラックパッド、タッチペンなどの入力タイプ全体で動作を検証し、マウスのスクロール ホイールとトラックパッドのジェスチャーがサポートされていることを確認します。

beforeAndAfter.webp

コンポジション ホストのデフォルト(Compose ランタイム)

HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey、ViewTreeHostDefaultKey を導入し、compose-runtime を通じてホストレベルのサービスを直接提供できるようにしました。これにより、ライブラリがルックアップのために compose-ui に依存する必要がなくなり、Kotlin マルチプラットフォームのサポートが向上します。これらの値をコンポジション ツリーにリンクするために、ライブラリ作成者は compositionLocalWithHostDefaultOf を使用して、ホストからデフォルトを解決する CompositionLocal を作成できます。

プレビュー ラッパー

Android Studio のカスタム プレビューは、Compose プレビューのコンテンツの表示方法を正確に定義できる新機能です。

PreviewWrapperProvider インターフェースを実装し、新しい @PreviewWrapper アノテーションを適用することで、特定の Theme の適用などのカスタム ロジックを簡単に挿入できます。このアノテーションは、@Composable と @Preview または @MultiPreview でアノテーションが付けられた関数に適用できます。これにより、プレビュー機能全体で動作する汎用的で使いやすいソリューションが提供され、繰り返しコードが大幅に削減されます。

class ThemeWrapper: PreviewWrapperProvider {
    @Composable
    override fun Wrap(content: @Composable (() -> Unit)) {
        JetsnackTheme {
            content()
        }
    }
}


@PreviewWrapper(ThemeWrapper::class)
@Preview
@Composable
private fun ButtonPreview() {
    // JetsnackTheme in effect
    Button(onClick = {}) {
        Text(text = "Demo")
    }
}

非推奨と削除

  • Compose 1.10 のブログ投稿でお知らせしたとおり、Modifier.onFirstVisible() は非推奨になります。その名前は、特に遅延レイアウト内で、スクロール中に複数回トリガーされるため、誤解を招くことがよくありました。Modifier.onVisibilityChanged() への移行をおすすめします。これにより、特定のユースケースの要件に合わせて、可視性の状態をより正確に手動でトラッキングできるようになります。
  • TextFields の D-pad ナビゲーションがデフォルトで常に有効になったため、ComposeFoundationFlags.isTextFieldDpadNavigationEnabled フラグは削除されました。新しい動作では、ゲームパッドまたはテレビのリモコンからの D-pad イベントが、最初にカーソルを所定の方向に移動します。カーソルがテキストの末尾に到達した場合にのみ、フォーカスを別の要素に移動できます。

今後の API

近日リリース予定の Compose 1.12.0 では、compileSdk が compileSdk 37 にアップグレードされ、AGP 9 と Compose に依存するすべてのアプリとライブラリがこの要件を継承します。Compose は、最新の Android 機能にアクセスできるように、新しい compileSdks を迅速に採用することを目指しているため、最新のリリース バージョンを常に把握しておくことをおすすめします。さまざまな API レベルでサポートされている AGP のバージョンについて詳しくは、こちらのドキュメントをご覧ください。

Compose 1.11.0 では、以下の API が @Experimental として導入されています。アプリでこれらの API をお試しいただき、フィードバックをお寄せください。@Experimental APIs は、早期の評価とフィードバックのために提供されているものであり、今後のリリースで大幅に変更または削除される可能性があります。

スタイル(試験運用版)

スタイル設定用の新しい試験運用版の基盤 API を導入します。Style API は、コンポーネントの視覚要素をカスタマイズするための新しいパラダイムです。従来は修飾子を使用して行われていました。シンプルな状態ベースのスタイル設定とアニメーション遷移により、スタイル設定可能なプロパティの基準セットを公開することで、より深く、より簡単なカスタマイズを実現できるように設計されています。この新しい API により、すでに有望なパフォーマンス上のメリットが確認されています。Style API が安定したら、マテリアル コンポーネントにスタイルを導入する予定です。

押された状態のスタイルの背景をオーバーライドする基本的な例を次に示します。

@Composable
fun LoginButton(modifier: Modifier = Modifier) {
    Button(
        onClick = {
            // Login logic
        },
        modifier = modifier,
        style = {
            background(
                Brush.linearGradient(
                    listOf(lightPurple, lightBlue)
                )
            )
            width(75.dp)
            height(50.dp)
            textAlign(TextAlign.Center)
            externalPadding(16.dp)

            pressed {
                background(
                    Brush.linearGradient(
                        listOf(Color.Magenta, Color.Red)
                    )
                )
            }
        }
    ){
        Text(
            text = "Login",
        )
    }
}
styles.webp

ドキュメントを確認し、こちらからバグを報告してください。

MediaQuery(試験運用版)

新しい mediaQuery API は、UI を環境に適応させるための宣言型でパフォーマンスの高い方法を提供します。複雑な情報検索を UiMediaScope 内の単純な条件に抽象化し、必要な場合にのみ再コンポーズが行われるようにします。

キーボードの種類やポインタの精度などのデバイス機能から、ウィンドウ サイズや形状などのコンテキストの状態まで、幅広い環境シグナルをサポートしているため、きめ細かくレスポンシブなエクスペリエンスを構築できます。derivedMediaQuery を使用してパフォーマンスを組み込み、高頻度の更新を処理します。また、スコープをオーバーライドする機能により、ハードウェア構成全体でテストとプレビューをシームレスに行うことができます。以前は、特定のデバイス プロパティ(デバイスがテーブルトップ モードかどうかなど)にアクセスするには、多くのボイラープレートを記述する必要がありました。

@Composable
fun isTabletopPosture(
    context: Context = LocalContext.current
): Boolean {
    val windowLayoutInfo by
        WindowInfoTracker
            .getOrCreate(context)
            .windowLayoutInfo(context)
            .collectAsStateWithLifecycle(null)

    return windowLayoutInfo.displayFeatures.any { displayFeature ->
        displayFeature is FoldingFeature &&
            displayFeature.state == FoldingFeature.State.HALF_OPENED &&
            displayFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
    }
}

@Composable
fun VideoPlayer() {
    if(isTabletopPosture()) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

UIMediaQuery を使用すると、mediaQuery 構文を追加して、デバイスがテーブルトップ モードかどうかなどのデバイス プロパティをクエリできるようになりました。

@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
    if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

ドキュメントを確認し、こちらからバグを報告してください。

グリッド(試験運用版)

Grid は、Jetpack Compose で複雑な 2 次元レイアウトを構築するための強力な新しい API です。Row と Column は線形デザインに適していますが、Grid を使用すると、スクロール可能なリストのオーバーヘッドなしで、画面レベルのアーキテクチャと複雑なコンポーネントに必要な構造制御が可能になります。Grid を使用すると、トラック、ギャップ、セルを使用してレイアウトを定義できます。Dp、パーセンテージ、固有のコンテンツ サイズ、柔軟な「Fr」単位など、使い慣れたサイズ設定オプションが用意されています。

@OptIn(ExperimentalGridApi::class)
@Composable
fun GridExample() {
    Grid(
        config = {
            repeat(4) { column(0.25f) }
            repeat(2) { row(0.5f) }
            gap(16.dp)
        }
    ) {
        Card1(modifier = Modifier.gridItem(rowSpan = 2)
        Card2(modifier = Modifier.gridItem(colmnSpan = 3)
        Card3(modifier = Modifier.gridItem(columnSpan = 2)
        Card4()
    }
}

アイテムを自動的に配置することも、複数の行や列に明示的に配置して、より正確に配置することもできます。さらに、適応性が高く、グリッドのトラックとスパンを動的に再構成して、テーブルトップ モードや向きの変更などのデバイスの状態に対応できるため、さまざまなフォーム ファクタで UI を美しく表示できます。

Grid.gif

ドキュメントを確認し、こちらからバグを報告してください。

FlexBox(試験運用版)

FlexBox は、高パフォーマンスで適応性の高い UI 向けに設計されたレイアウト コンテナです。利用可能なコンテナのサイズに基づいて、アイテムのサイズ設定とスペースの配分を管理します。折り返し(wrap)やアイテムの多軸配置(justifyContent, alignItems, alignContent)などの複雑なタスクを処理します。アイテムを拡大(grow)または縮小(shrink)してコンテナを埋めることができます。

@OptIn(ExperimentalFlexBoxApi::class)
fun FlexBoxWrapping(){
    FlexBox(
        config = {
            wrap(FlexWrap.Wrap)
            gap(8.dp)
        }
    ) {
        RedRoundedBox()
        BlueRoundedBox()
        GreenRoundedBox(modifier = Modifier.width(350.dp).flex { grow(1.0f) })
        OrangeRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.7f) })
        PinkRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.3f) })
    }
}
AnimationGif.gif

ドキュメントを確認し、こちらからバグを報告してください。

新しい SlotTable の実装(試験運用版)

SlotTable の新しい実装が導入されました。このリリースではデフォルトで無効になっています。SlotTable は、Compose ランタイムがコンポジション階層の状態の追跡、無効化 / 再コンポーズの追跡、記憶された値の保存、実行時のコンポジションのすべてのメタデータの追跡に使用する内部データ構造です。この新しい実装は、主にランダムな編集に関するパフォーマンスを向上させるように設計されています。

新しい SlotTable を試すには、ComposeRuntimeFlags.isLinkBufferComposerEnabled を有効にしてください。 

今すぐコーディングを始めましょう。

Jetpack Compose には、多くの魅力的な新しい API が用意されており、今後もさらに追加される予定です。Jetpack Compose への移行を検討するのに、これほど最適な時期はありません。皆様からのフィードバックや機能リクエスト(特に、まだ開発中の @Experimental 機能に関するもの)は、常に貴重な情報として参考にさせていただいております。こちらからお寄せください。Compose を使ったコーディングをお楽しみください。

作成者:
続きを読む