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 宣布的選擇加入期過後,第 2 版測試 API 現已成為預設,第 1 版 API 則已淘汰。主要異動是預設測試調度工具的變更。第 1 版 API 依賴會立即執行協同程式的 UnconfinedTestDispatcher,第 2 版 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 起可辨識的複雜觸控板手勢,包括雙指滑動和雙指撥動。Modifier.scrollable 和 Modifier.transformable 等元件會自動辨識這些手勢,以便在觸控板上提供更優質的行為。
這些變更可改善內建元件的觸控板行為,包括移除多餘的觸控容錯、提供更直覺的拖曳起始手勢、在文字欄位中選取按兩下和三擊,以及在文字欄位中提供電腦樣式的內容選單。
如要測試觸控板行為,可以使用 performTrackpadInput, 的新測試 API,驗證應用程式在搭配觸控板使用時的行為。如果您有自訂手勢偵測工具,請驗證各種輸入類型的行為,包括觸控螢幕、滑鼠、觸控板和觸控筆,並確保支援滑鼠滾輪和觸控板手勢。
組合主機預設值 (Compose 執行階段)
我們推出了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey 和 ViewTreeHostDefaultKey,可直接透過 compose-runtime 提供主機層級服務。這樣一來,程式庫就不必依附於 compose-ui 進行查閱,可更完善地支援 Kotlin Multiplatform。如要將這些值連結至組合結構樹,程式庫作者可以使用 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(),以便根據特定用途需求,更精確地手動追蹤可見度狀態。 ComposeFoundationFlags.isTextFieldDpadNavigationEnabled旗標已移除,因為TextFields的 D-pad 導覽功能現在預設一律啟用。這項新行為可確保遊戲手把或電視遙控器的 D-pad 事件會先將游標移至指定方向,游標移到文字結尾時,焦點才能移到其他元素。
即將推出的 API
在即將推出的 Compose 1.12.0 版本中,compileSdk 將升級至 compileSdk 37,AGP 9 和所有依附於 Compose 的應用程式和程式庫都會繼承這項需求。Compose 的目標是迅速採用新的 compileSdks,以便提供最新的 Android 功能,因此建議您隨時更新至最新發布的版本。請務必查看這份說明文件,進一步瞭解不同 API 級別支援的 AGP 版本。
Compose 1.11.0 推出下列 API@Experimental,歡迎您在應用程式中試用,並提供意見回饋。請注意,@Experimental APIs僅供早期評估和意見回饋,在日後版本中可能會有重大變更或移除。
樣式 (實驗功能)
我們將推出新的實驗性基礎 API,用於設定樣式。Style API 是自訂元件視覺元素的新模式,傳統上是使用修飾符執行。這項功能會公開一組標準組合的可設定樣式屬性,並提供簡單的狀態樣式和動畫轉場效果,讓您更輕鬆地進行更深入的自訂。我們已看到這項新 API 帶來可觀的成效優勢。我們計畫在 Style API 穩定後,採用 Material 元件中的樣式。
以下是覆寫按下狀態樣式背景的基本範例:
@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", ) } }
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 是功能強大的新 API,可在 Jetpack Compose 中建構複雜的二維版面配置。雖然 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 在各種板型規格上都能呈現最佳效果。
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) }) } }
新的 SlotTable 實作方式 (實驗版)
我們推出了新的 SlotTable 實作方式,但這個版本預設會停用這項功能。SlotTable 是 Compose 執行階段用來追蹤組合階層狀態、追蹤失效/重組、儲存記憶值,以及追蹤執行階段所有組合中繼資料的內部資料結構。這項新實作方式旨在提升效能,特別是隨機編輯作業。
如要試用新版 SlotTable,請啟用 ComposeRuntimeFlags.isLinkBufferComposerEnabled。
立即開始編寫程式!
Jetpack Compose 推出許多令人期待的新 API,未來還會推出更多,現在正是遷移至 Jetpack Compose 的最佳時機。一如既往,我們十分重視您的意見回饋和功能要求 (尤其是仍在開發中的 @Experimental 功能),歡迎前往這裡提交。祝編寫愉快!
-
產品最新消息今天,我們分享了如何將「不只是商店」的願景推向新階段。從個人專頁 (每月活躍使用者超過 2.5 億人) 到整合式遊戲平台 (連結超過 7 億個遊戲個人資料),Google Play 都能滿足使用者的需求。
Paul Feng • 閱讀時間:3 分鐘 -
產品最新消息Android 開發人員在開發應用程式時,可以選擇多種代理、大型語言模型、工具和指令列介面 (CLI)。我們的目標是協助您打造精美、優質的 Android 應用程式,無論您選擇何種建構方式。
Simona Milanovic • 閱讀時間:4 分鐘 -
產品最新消息Google Play 持續擴大訂閱平台,協助您推動成長、適應新商業模式,並在使用者所在之處與他們互動。
Sheenam Mittal • 閱讀時間:4 分鐘
每週透過電子郵件接收最新的 Android 開發深入分析。