Die Jetpack Compose-Version vom August 2026 ist jetzt stabil. Diese Version enthält Version 1.12 für die wichtigsten Compose-Module (siehe die vollständige BOM-Zuordnung). Sie bietet umfangreiche visuelle APIs wie Mesh-Verläufe und Unterstützung für Wide Color Gamut (WCG), strukturelle Layoutfunktionen wie benannte Bereiche in Grid, eine nahtlose Integration mit dem Credential Manager von Android sowie erhebliche Verbesserungen bei Tests und Leistung.
Wenn Sie Ihr Projekt auf die aktuelle Version aktualisieren möchten, aktualisieren Sie Ihre Compose BOM-Version auf 2026.08.00:
implementation(platform("androidx.compose:compose-bom:2026.08.00"))
Breaking Changes
- AGP und Compile SDK: Mit Compose 1.12 wird das Compile SDK auf API 37 aktualisiert. Dafür ist mindestens AGP 9.1.2 erforderlich. Zur Erinnerung: Compose verwendet immer das neueste Compile SDK. Weitere Informationen zu dieser Änderung finden Sie hier.
Modifier.onFirstVisible()wurde eingestellt: Migrieren Sie zu Modifier.onVisibilityChanged(), das eine genauere Nachverfolgung des Sichtbarkeitsschwellenwerts bietet.
Grafik
Mesh-Verläufe
Mit Compose 1.12 wird MeshGradientPainter eingeführt, mit dem Sie organische Farbverläufe mit mehreren Punkten erstellen können.
val rows = 1 val columns = 1 val gradientPainter = remember { MeshGradientPainter(rows, columns) { // Parameters: row, column, position, color setVertex(0, 0, Offset(0f, 0f), Color.Red) // Top-Left setVertex(0, 1, Offset(1f, 0f), Color.Blue) // Top-Right setVertex(1, 0, Offset(0f, 1f), Color.Green) // Bottom-Left setVertex(1, 1, Offset(1f, 1f), Color.Yellow) // Bottom-Right } } Box( modifier = modifier .aspectRatio(16/9f) .fillMaxWidth() .paint(gradientPainter) )
Weitere Informationen und Beispiele finden Sie in der Dokumentation.
Unterstützung für Wide Color Gamut und HDR
Moderne Displays bieten eine erweiterte Farbtreue und einen höheren Dynamikbereich. In Compose 1.12 wurde die vollständige Pipelineunterstützung für Wide Color Gamut (P3) und HDR-Rendering für Compose-Grafiken, -Farben und -Shader aktiviert. Farben, die in Nicht-sRGB-Farbräumen (z. B. Display P3) definiert sind, werden bis zum Rendering auf der Plattform beibehalten, ohne dass Farben abgeschnitten werden. Farben werden sicher auf sRGB zurückgesetzt, wenn sie einen nicht unterstützten Farbraum verwenden (z. B. CieXyz, CieLab oder Oklab), auf einem Farbraum auf einer nicht unterstützten Android-Version basieren (z. B. Bt2020Hlg unter Android 13 und niedriger) oder wenn die App unter Android 9 (API 28) und niedriger ausgeführt wird.
Weitere wichtige Änderungen:
LayerOutsetswurde zuGraphicsLayer&Modifier.graphicsLayerhinzugefügt. Damit können Sie die visuellen Grenzen der Ebene über ihre gemessene Größe hinaus erweitern. Wenden SieLayerOutsetsan, um das impliziteclipToBounds-Verhalten zu vermeiden, wenn die Ebene in einen Offscreen-Puffer verschoben wird.
Designs
Auf der Google I/O haben wir unsere erste Vision für die Compose Styles API vorgestellt – eine einheitliche, leistungsstarke Möglichkeit, Komponenten zu gestalten. Seitdem haben wir die zugrunde liegende Architektur weiterentwickelt, um eine strenge Typsicherheit und vorhersehbare Korrektheit zu gewährleisten und die Entwicklung benutzerdefinierter Designsysteme zu unterstützen.
Damit diese grundlegende Ebene korrekt ist, bleibt die API experimentell. Es kann zu Breaking Changes kommen.
Laufzeitoptimierungen
Überlastung von SideEffect mit Schlüssel
SideEffect unterstützt jetzt Schlüsselargumente, mit denen Sie einmalige Nebeneffekte auslösen können, wenn sich bestimmte Schlüssel ändern. Dies kann zu einer besseren Leistung führen als die Verwendung von LaunchedEffect oder DisposableEffect , wenn Sie die Coroutine oder den Dispose-Block nicht benötigen. SideEffect ist bis zu 90% schneller als LaunchedEffect und etwa 20% schneller als DisposableEffect. Beachten Sie, dass SideEffect seinen Effekt vor DisposableEffect und LaunchedEffect ausführt. Seien Sie daher vorsichtig, wenn Sie vorhandene Effekte zu dieser API migrieren, insbesondere bei LaunchedEffects, die nach Abschluss des aktuellen Frames gesendet werden müssen.
@Composable fun AnalyticsTracker(userId: String, screenName: String) { SideEffect(key1 = userId, key2 = screenName) { analytics.logScreenView(userId, screenName) } }
Animation
DeferredTargetAnimationist nicht mehr experimentell.
Interaktive zweistufige Übergänge
- Neue Composables:
DeferredAnimatedContentundDeferredAnimatedVisibilityermöglichen die Erstellung ansprechender zweistufiger Übergänge, z.B. für die prädiktive Nachverfolgung von Zurück-Gesten. - Manuelle Animationssteuerung: Während der verzögerten Phase eines Übergangs können animierte Eigenschaften (z. B. Skalierung oder Versatz) jetzt in Echtzeit manuell bearbeitet werden (z. B. bei der Nachverfolgung einer Wischgeste).
- Nahtlose Übergabe: Sobald die verzögerte Phase endet, übernimmt die Übergangs-Engine und führt eine nahtlose Übergabe durch, einschließlich der Geschwindigkeitsübertragung, zur automatischen Übergabe.
- Unterstützung für gemeinsame Elemente: Ein neues
permitTransformDuringDeferredTransitionFlag inSharedContentConfigsteuert, ob sich gemeinsame Elemente während der verzögerten Übergangsphase visuell zusammen mit ihren übergeordneten Containern transformieren.
val state = remember { DeferredTransitionState(initialScreen) } val transition = rememberDeferredTransition(state) if (predictiveBackInProgress) { state.defer(targetScreen) } else { state.animateTo(targetScreen) } transition.DeferredAnimatedContent( targetState = targetScreen, mutableTransformSpec = { MutableContentTransform { // Manually manipulate properties during the deferred phase initialContentTransform { scale = swipeProgress } } } ) { screen -> ScreenContent(screen) }
Im Folgenden finden Sie zwei Demos von Anwendungsfällen, in denen eine gestengesteuerte Animation an eine ausgelöste Animation übergeben wird:
Text-, Eingabe- und Plattformintegrationen
Bearbeitbare Textformatierung
Neue APIs bieten Rich-Text-Formatierung für bearbeitbaren Text in BasicTextField. Sie können jetzt Inline-Zeichen- und Absatzformatierungen programmatisch mit SpanStyle und ParagraphStyle über die neue Methode addStyle() in einem TextFieldBuffer-Bereich anwenden und bearbeiten (z. B. in textFieldState.edit { ... } oder einer InputTransformation). Außerdem bietet TextFieldBuffer die APIs getSpanStyles() und getParagraphStyles(), die TrackedRange-Objekte zurückgeben, mit denen Sie angewendete Stile lesen, aktualisieren oder entfernen können. Zur Ergänzung der Formatierungserstellung stellt TextFieldState jetzt die schreibgeschützte Eigenschaft textStyles zum Abfragen aktiver Stile in Bereichen bereit, während TextFieldBuffer originalTextStyles bietet, um den Formatierungsstatus vor einer Bearbeitung zu prüfen. Textformatierung und benutzerdefinierte Anmerkungen bleiben bei Konfigurationsänderungen erhalten.
val state = rememberTextFieldState("Formatted text in Compose 1.12") // Apply bold and color styles to a range of text state.edit { addStyle( SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue), start = 0, end = 9 ) } // Query active styles from TextFieldState val currentStyles = state.textStyles
Textauswahl
Eine neue SelectionState-API bietet programmatische Steuerung und Beobachtbarkeit für die Textauswahl in einem SelectionContainer. Wenn Sie ein SelectionState-Objekt über rememberSelectionState() hochstufen und an SelectionContainer übergeben, wird selectedTexts als reaktive Liste von AnnotatedStrings verfügbar. Außerdem werden Methoden wie selectAll(), clear(), select(TextRange) und extendSelectionByWord() bereitgestellt.
Verwenden Sie außerdem getSelectableTexts(), um alle auswählbaren Textelemente in Layoutreihenfolge abzurufen und Text in Composables im SelectionContainer mit einem globalen Bereich auszuwählen.
@Composable fun ProgrammaticSelectionExample() { val selectionState = rememberSelectionState() Column { Button( onClick = { selectionState.selectAll() }, modifier = Modifier.disableSelectionClearOnTap() ) { Text("Select All") } SelectionContainer(state = selectionState) { Text("Text content to be selected programmatically.") } } }
Credential Manager-Integration
Compose-Textfelder lassen sich jetzt nativ in den Credential Manager von Android (API 34 und höher) über das Autofill-Framework einbinden (unter API 34 wird dies von androidx.credentials library übernommen). Wenn Sie die neue semantische Eigenschaft credentialRequest mit CredentialRequestData anhängen, können Texteingaben direkt im Eingabefluss des Nutzers Passkeys, gespeicherte Anmeldedaten oder Anmeldeanfragen auslösen.
@Composable fun LoginField(textFieldState: TextFieldState) { val credentialData = remember { CredentialRequestData( // Specify Credential Manager request options ) } BasicTextField( state = textFieldState, modifier = Modifier.semantics { credentialRequest = credentialData } ) }
Weitere wichtige Änderungen:
- Unterstützung für Einstellungen für Schriftvarianten in herunterladbaren Schriftarten.
- Automatisches Scrollen aktiviert, wenn die Textauswahl in
SelectionContainerüber den Darstellungsbereich hinaus gezogen wird. - Unterstützung für automatische Interaktionssounds (Klicks und Fokusnavigation) für Compose-Komponenten hinzugefügt, mit einem neuen
SoundEffectOnInteraction-Composable, mit dem Nutzer die Funktion deaktivieren können. Aufgrund dieser Änderung müssen semantische Klick-Listener jetzt aus dem Hauptthread aufgerufen werden, was sich auf eine kleine Anzahl von Testfällen auswirken kann. KeyboardTypeenthält jetztDate,Time,DateTime, undSignedDecimal.BasicSecureTextFieldverwendet jetzt standardmäßigTextObfuscationMode.System, währendRevealLastTypedals absolute Überschreibung dient.
Layoutverbesserungen
Benannte Bereiche im Rasterlayout
Das Erstellen komplexer 2D-Layouts ist jetzt einfacher, da die @Experimental Grid-Komponente benannte Bereiche unterstützt. Anstatt numerische Spalten- und Zeilenindizes für Elemente zu verwalten, können Sie semantische Bereiche in Ihrem GridConfigurationScope definieren und Composables nach Bereichsnamen positionieren.
@OptIn(ExperimentalGridApi::class) @Composable fun DashboardLayout() { Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) gap(16.dp) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) NavigationSidebar(modifier = Modifier.gridItem(areaId = "sidebar")) MainContentView(modifier = Modifier.gridItem(areaId = "content")) } }
Weitere Informationen finden Sie in der Dokumentation.
Leistung
Wie bei jeder Version investieren wir weiterhin in die Leistung von Compose, damit Sie mit dem Framework ansprechende, leistungsstarke Apps entwickeln können. In dieser Version haben wir uns auf die Verbesserung der Startleistung konzentriert. Die Zeit bis zur ersten Anzeige (die Zeit, die eine App benötigt, um den ersten Frame zu erstellen) ist jetzt mit der von Views in unseren Benchmarks vergleichbar.
Verbesserungen bei Tests und Tools
Testsynchronisierung
Mit Compose 1.12 werden neue Test-APIs eingeführt, mit denen sich die Testausführungszeiten verkürzen und Flakiness beim Status-Sampling vermeiden lassen:
hasPendingWork: Prüft passiv, ob in der UI noch ausstehende Aufgaben vorhanden sind, ohne die Uhr vorzustellen. Dies ist ideal für manuelle Animationsschleifen.runWithoutImplicitWait: Deaktiviert vorübergehend die implizite Synchronisierung, wenn Sie manuelle Uhr-Frames durchlaufen (z.B. bei Animationstests).
@Test fun testAnimationStateFast() { composeTestRule.mainClock.autoAdvance = false while (composeTestRule.hasPendingWork()) { composeTestRule.mainClock.advanceTimeByFrame() composeTestRule.waitForIdle() composeTestRule.runOnUiThread { composeTestRule.runWithoutImplicitWait { // This is most effective when querying multiple nodes in a single frame. // It prevents the redundant synchronization overhead that would // otherwise occur on every individual query. val box1 = composeTestRule.onNodeWithTag("Box1").fetchSemanticsNode() val box2 = composeTestRule.onNodeWithTag("Box2").fetchSemanticsNode() assertThat(box1.boundsInRoot.right).isAtMost(box2.boundsInRoot.left) } } } }
Weitere wichtige Änderungen:
- Die
captureToImage-API ermöglicht es Ihnen jetzt, ein Pop-up oder Dialogfeld zusammen mit dem zugehörigen Anker in einer einzelnen Bitmap zu erfassen. onRootWithViewInteractionhinzugefügt, um semantische Compose-Suchanfragen auf bestimmte Android-Ansichten zu beschränken. Dadurch wird das Testen hybrider UIs wieRecyclerViewsvereinfacht, ohne dass eindeutige Test-Tags im Produktionscode erforderlich sind.@PreviewWrapper-Annotationen können jetzt auf benutzerdefinierte@MultiPreview-Klassen angewendet werden, um wiederverwendbare Vorschaukonfigurationen (z. B. benutzerdefinierte Designs) für mehrere Komponenten zu ermöglichen.
Viel Spaß beim Entwickeln mit Compose!
Mit Compose 1.12 ist die App-Entwicklung einfacher und ausdrucksstärker als je zuvor. Dazu tragen Mesh-Verläufe, Unterstützung für Wide Color Gamut, herunterladbare variable Schriftarten, die Credential Manager-Integration und schnellere Testtools bei. Wie immer freuen wir uns über Ihr Feedback. Teilen Sie uns im Issue Tracker mit, was Sie von diesen Änderungen halten oder was Sie sich als Nächstes wünschen. Viel Spaß beim Entwickeln mit Compose!
-
ProduktneuheitenMit der Einführung des Pixel 11 Pro Fold, der Pixel Watch 5 und der gesamten Pixel-Familie können Nutzer nahtlos zwischen verschiedenen Bildschirmgrößen, einzigartigen Formfaktoren und intelligenten Funktionen wechseln.
-
ProduktneuheitenHeute feiern wir offiziell den fünften Geburtstag von Jetpack Compose 1.0. Von Version 1.0, die am 28. Juli 2021 angekündigt wurde, bis zur neuesten Version 1.11 haben sich die APIs im Laufe der Jahre erheblich weiterentwickelt. Das ist ein Grund zum Feiern.
Rebecca Franks, Nick Butcher, Loryn Hairston • Lesezeit: 4 Minuten -
ProduktneuheitenIn den fast fünf Jahren seit der Einführung von Jetpack Compose haben wir in alle Funktionen, Leistungsverbesserungen und Tools investiert, die Sie benötigen, um ansprechende UIs für die verschiedenen Android-Geräte zu entwickeln.
Nick Butcher • Lesezeit: 2 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.