プロダクト ニュース

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

所要時間: 5 分
2026 年 4 月 22 日
Meghan Mehta
Android デベロッパー アドボケイト

本日、Jetpack Compose 2026 年 4 月リリース版が安定版になりました。このリリースには、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.scrollableModifier.transformable などのコンポーネントで自動的に認識され、トラックパッドでの動作が改善されます。

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

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

beforeAndAfter.webp

Composition ホストのデフォルト(Compose ランタイム)

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

プレビュー ラッパー

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

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

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

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

非推奨と削除

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

今後の API

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

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

スタイル(試験運用版)

スタイリング用の新しい試験運用版の Foundation API を導入します。Style API は、これまで Modifier で行われてきたコンポーネントのビジュアル要素をカスタマイズするための新しいパラダイムです。シンプルな状態ベースのスタイリングとアニメーション トランジションを備えた標準のスタイル設定可能なプロパティ セットを公開することで、より深く、より簡単にカスタマイズできるように設計されています。この新しい 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(試験運用版)

Grid は、Jetpack Compose で複雑な 2 次元レイアウトを構築するための強力な新しい API です。RowColumn は線形デザインに適していますが、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 ランタイムが Composition 階層の状態の追跡、無効化/再コンポーズの追跡、記憶された値の保存、実行時の Composition のすべてのメタデータの追跡に使用する内部データ構造です。この新しい実装は、主にランダム編集のパフォーマンスを向上させるように設計されています。

新しい SlotTable を試すには、ComposeRuntimeFlags.isLinkBufferComposerEnabled を有効にします。 

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

Jetpack Compose には多くのエキサイティングな新しい API が用意されており、今後もさらに多くの API が登場する予定です。Jetpack Compose に移行するのに最適なタイミングです。Google では、皆様からのフィードバックや機能リクエスト(特に、まだ開発中の @Experimental 機能に関するもの)を重視しています。 こちらからお寄せください。Compose を使ったコーディングをお楽しみください。

作成者:

続きを読む