プロダクト ニュース

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

所要時間: 5 分
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

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

HostDefaultProviderLocalHostDefaultProviderHostDefaultKeyViewTreeHostDefaultKey を導入し、compose-runtime を通じてホストレベルのサービスを直接提供できるようにしました。これにより、ライブラリがルックアップのために compose-ui に依存する必要がなくなり、Kotlin マルチプラットフォームのサポートが向上します。これらの値をコンポジション ツリーにリンクするには、ライブラリ作成者は 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() は非推奨となります。この名前は誤解を招くことが多く、特に遅延レイアウトでは、スクロール中に複数回トリガーされることがありました。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 は早期の評価とフィードバックのために提供されており、今後のリリースで大幅な変更や削除が行われる可能性があります。

スタイル(試験運用版)

スタイル設定用の新しい試験運用版の基盤 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 です。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 ランタイムがコンポジション階層の状態の追跡、無効化/再コンポーズの追跡、保存された値の保存、コンポジションのすべてのメタデータの実行時の追跡に使用する内部データ構造です。この新しい実装は、主にランダム編集のパフォーマンスを向上させるように設計されています。

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

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

Jetpack Compose には多くのエキサイティングな新しい API があり、今後もさらに多くの API が登場する予定です。今こそ Jetpack Compose に移行する絶好の機会です。Google では、皆様からのフィードバックや機能リクエスト(特に @Experimental 機能のベータ版)を重視しています。フィードバックや機能リクエストは、こちらからお寄せください。Compose をお楽しみください。

作成者:

続きを読む