Das Jetpack Compose-Release vom April 2026 ist jetzt stabil. Dieses Release enthält Version 1.11 der Compose-Kernmodule (siehe die vollständige BOM-Zuordnung), Debugging-Tools für gemeinsame Elemente, Trackpad-Ereignisse und mehr. Außerdem gibt es einige experimentelle APIs, die Sie gerne ausprobieren und uns Feedback dazu geben können.
Wenn Sie das heutige Release verwenden möchten, aktualisieren Sie Ihre Compose-BOM-Version auf:
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Änderungen in Compose 1.11.0
Ausführung von Koroutinen in Tests
Wir führen eine wichtige Änderung an der Art und Weise ein, wie Compose die Testzeitplanung handhabt. Nach der in Compose 1.10 angekündigten Opt-in-Phase sind die v2-Test-APIs jetzt die Standardeinstellung und die v1-APIs wurden eingestellt. Die wichtigste Änderung ist die Umstellung des Standard-Test-Dispatchers. Während die v1-APIs auf den UnconfinedTestDispatcher angewiesen waren, der Koroutinen sofort ausführte, verwenden die v2-APIs den StandardTestDispatcher. Wenn also eine Koroutine in Ihren Tests gestartet wird, wird sie jetzt in die Warteschlange gestellt und erst ausgeführt, wenn die virtuelle Uhr weitergestellt wird.
Dadurch werden Produktionsbedingungen besser nachgeahmt, Race-Bedingungen effektiv beseitigt und Ihre Testsuite deutlich robuster und weniger fehleranfällig.
Damit Ihre Tests dem Standardverhalten von Koroutinen entsprechen und zukünftige Kompatibilitätsprobleme vermieden werden, empfehlen wir dringend, Ihre Test-Suite zu migrieren. In unserem umfassenden Migrationsleitfaden finden Sie API-Zuordnungen und häufige Korrekturen.
Verbesserungen bei gemeinsamen Elementen und Animationstools
Außerdem haben wir einige praktische visuelle Debugging-Tools für gemeinsame Elemente und Modifier.animatedBounds hinzugefügt. Sie können jetzt genau sehen, was im Hintergrund passiert, z. B. Zielbegrenzungen, Animationstrajektorien und wie viele Übereinstimmungen gefunden werden. So lässt sich viel leichter erkennen, warum sich ein Übergang möglicherweise nicht wie erwartet verhält. Wenn Sie die neuen Tools verwenden möchten, umschließen Sie einfach Ihr SharedTransitionLayout mit dem LookaheadAnimationVisualDebugging Composable.
LookaheadAnimationVisualDebugging( overlayColor = Color(0x4AE91E63), isEnabled = true, multipleMatchesColor = Color.Green, isShowKeylabelEnabled = false, unmatchedElementColor = Color.Red, ) { SharedTransitionLayout { CompositionLocalProvider( LocalSharedTransitionScope provides this, ) { // your content } } }
Trackpad-Ereignisse
Wir haben die Compose-Unterstützung für Trackpads überarbeitet, z. B. für integrierte Laptop-Trackpads, an Tablets anbringbare Trackpads oder externe/virtuelle Trackpads. Einfache Trackpad-Ereignisse werden jetzt im Allgemeinen als PointerType.Mouse-Ereignisse betrachtet, wodurch das Verhalten von Maus und Trackpad besser an die Erwartungen der Nutzer angepasst wird. Bisher wurden diese Trackpad-Ereignisse als gefälschte Touchscreen-Finger von PointerType.Touch interpretiert, was zu verwirrenden Nutzererfahrungen führte. Wenn Sie beispielsweise mit einem Trackpad geklickt und gezogen haben, wurde gescrollt, anstatt etwas auszuwählen. Durch die Änderung des Zeigertyps, den diese Ereignisse im neuesten Release von Compose haben, wird beim Klicken und Ziehen mit einem Trackpad nicht mehr gescrollt.
Außerdem wurde die Unterstützung für kompliziertere Trackpad-Gesten hinzugefügt, die seit API 34 von der Plattform erkannt werden, darunter Wischen mit zwei Fingern und Pinch-Gesten. Diese Gesten werden automatisch von Komponenten wie Modifier.scrollable und Modifier.transformable erkannt, um das Verhalten mit Trackpads zu verbessern.
Diese Änderungen verbessern das Verhalten für Trackpads in integrierten Komponenten. So wurden beispielsweise redundante Touch-Slops entfernt, eine intuitivere Drag-and-drop-Startgeste eingeführt, die Auswahl durch Doppelklick und Dreifachklick in Textfeldern ermöglicht und Kontextmenüs im Desktop-Stil in Textfeldern hinzugefügt.
Zum Testen des Trackpad-Verhaltens gibt es neue Test-APIs mit performTrackpadInput,, mit denen Sie das Verhalten Ihrer Apps bei Verwendung mit einem Trackpad validieren können. Wenn Sie benutzerdefinierte Gestenerkennung haben, validieren Sie das Verhalten für verschiedene Eingabetypen, darunter Touchscreens, Mäuse, Trackpads und Eingabestifte, und sorgen Sie für Unterstützung für Maus-Scrollräder und Trackpad-Gesten.
Standardeinstellungen für den Kompositionshost (Compose-Laufzeit)
Wir haben HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey und ViewTreeHostDefaultKey eingeführt, um Dienste auf Hostebene direkt über die Compose-Laufzeit bereitzustellen. Dadurch müssen Bibliotheken nicht mehr von compose-ui für Suchvorgänge abhängig sein, was die Unterstützung für Kotlin Multiplatform verbessert. Um diese Werte mit der Kompositionsstruktur zu verknüpfen, können Bibliotheksautoren compositionLocalWithHostDefaultOf verwenden, um ein CompositionLocal zu erstellen, das Standardwerte vom Host auflöst.
Vorschau-Wrapper
Benutzerdefinierte Vorschauen in Android Studio ist eine neue Funktion, mit der Sie genau festlegen können, wie die Inhalte einer Compose-Vorschau angezeigt werden.
Durch die Implementierung der PreviewWrapperProvider-Schnittstelle und die Anwendung der neuen Annotation @PreviewWrapper können Sie ganz einfach benutzerdefinierte Logik einschleusen, z. B. ein bestimmtes Theme anwenden. Die Annotation kann auf eine Funktion angewendet werden, die mit @Composable und @Preview oder @MultiPreview annotiert ist. So erhalten Sie eine generische, einfach zu verwendende Lösung, die für alle Vorschaufunktionen funktioniert und die Menge an sich wiederholendem Code deutlich reduziert.
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") } }
Einstellung und Entfernung
- Wie im Blogpost zu Compose 1.10 angekündigt, wird
Modifier.onFirstVisible()eingestellt. Der Name führte oft zu Missverständnissen, insbesondere bei Lazy-Layouts, bei denen die Funktion beim Scrollen mehrmals ausgelöst wurde. Wir empfehlen, zuModifier.onVisibilityChanged()zu migrieren. Damit können Sie den Sichtbarkeitsstatus genauer manuell verfolgen und an Ihre spezifischen Anwendungsfallanforderungen anpassen. - Das Flag
ComposeFoundationFlags.isTextFieldDpadNavigationEnabledwurde entfernt, da die Steuerkreuz-Navigation fürTextFieldsjetzt standardmäßig immer aktiviert ist. Das neue Verhalten sorgt dafür, dass die Steuerkreuz-Ereignisse von einem Gamepad oder einer TV-Fernbedienung zuerst den Cursor in die angegebene Richtung bewegen. Der Fokus kann erst dann auf ein anderes Element verschoben werden, wenn der Cursor das Ende des Texts erreicht.
Kommende APIs
Im kommenden Compose 1.12.0-Release wird compileSdk auf compileSdk 37 aktualisiert. AGP 9 und alle Apps und Bibliotheken, die von Compose abhängig sind, übernehmen diese Anforderung. Wir empfehlen, immer die neuesten veröffentlichten Versionen zu verwenden, da Compose neue compileSdks schnell übernimmt, um Zugriff auf die neuesten Android-Funktionen zu ermöglichen. Weitere Informationen dazu, welche AGP-Version für die verschiedenen API-Level unterstützt wird, finden Sie in der Dokumentation.
In Compose 1.11.0 werden die folgenden APIs als @Experimental eingeführt. Wir freuen uns auf Ihr Feedback, wenn Sie sie in Ihren Apps ausprobieren. Beachten Sie, dass @Experimental APIs zur frühen Bewertung und für Feedback bereitgestellt werden und sich in zukünftigen Releases erheblich ändern oder entfernt werden können.
Designs (experimentell)
Wir führen eine neue experimentelle Foundation API für Styling ein. Die Style API ist ein neues Paradigma zum Anpassen visueller Elemente von Komponenten, das bisher mit Modifikatoren durchgeführt wurde. Sie wurde entwickelt, um eine umfassendere und einfachere Anpassung zu ermöglichen, indem ein Standardsatz von anpassbaren Eigenschaften mit einfachem zustandsbasiertem Styling und animierten Übergängen bereitgestellt wird. Mit dieser neuen API sehen wir bereits vielversprechende Leistungsvorteile. Wir planen, Styles in Material-Komponenten zu übernehmen, sobald die Style API stabil ist.
Ein einfaches Beispiel für das Überschreiben des Hintergrunds eines Stils für den gedrückten Zustand:
@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", ) } }
Weitere Informationen finden Sie in der Dokumentation. Fehler können Sie hier melden.
MediaQuery (experimentell)
Die neue mediaQuery-API bietet eine deklarative und leistungsstarke Möglichkeit, die UI an die Umgebung anzupassen. Sie abstrahiert komplexe Informationen in einfache Bedingungen innerhalb eines UiMediaScope, sodass eine Neuzusammensetzung nur bei Bedarf erfolgt.
Mit Unterstützung für eine Vielzahl von Umgebungssignalen – von Gerätefunktionen wie Tastaturtypen und Zeigergenauigkeit bis hin zu Kontextzuständen wie Fenstergröße und -ausrichtung – können Sie hochgradig responsive Nutzererfahrungen entwickeln. Die Leistung ist mit derivedMediaQuery integriert, um häufige Aktualisierungen zu verarbeiten. Die Möglichkeit, Bereiche zu überschreiben, ermöglicht nahtlose Tests und Vorschauen für verschiedene Hardwarekonfigurationen. Bisher mussten Sie viel Boilerplate-Code schreiben, um auf bestimmte Geräteeigenschaften zuzugreifen, z. B. um zu prüfen, ob sich ein Gerät im Tischmodus befindet:
@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() } }
Mit UIMediaQuery können Sie jetzt die mediaQuery-Syntax hinzufügen, um Geräteeigenschaften abzufragen, z. B. ob sich ein Gerät im Tischmodus befindet:
@OptIn(ExperimentalMediaQueryApi::class) @Composable fun VideoPlayer() { if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) { TabletopLayout() } else { FlatLayout() } }
Weitere Informationen finden Sie in der Dokumentation. Fehler können Sie hier melden.
Grid (experimentell)
Grid ist eine leistungsstarke neue API zum Erstellen komplexer zweidimensionaler Layouts in Jetpack Compose. Row und Column eignen sich zwar gut für lineare Designs, aber mit Grid haben Sie die strukturelle Kontrolle, die für die Architektur auf Bildschirmebene und komplexe Komponenten erforderlich ist, ohne den Overhead einer scrollbaren Liste. Mit Grid können Sie Ihr Layout mit Spuren, Lücken und Zellen definieren und dabei bekannte Größenoptionen wie Dp, Prozentsätze, intrinsische Inhaltsgrößen und flexible „Fr“-Einheiten verwenden.
@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() } }
Sie können Elemente automatisch platzieren oder sie explizit über mehrere Zeilen und Spalten verteilen, um eine präzise Platzierung zu erreichen. Das Beste daran ist, dass es sehr anpassungsfähig ist. Sie können Ihre Grid-Spuren und -Spannen dynamisch neu konfigurieren, um auf Gerätezustände wie den Tischmodus oder Änderungen der Ausrichtung zu reagieren. So sieht Ihre UI auf allen Formfaktoren gut aus.
Weitere Informationen finden Sie in der Dokumentation. Fehler können Sie hier melden.
FlexBox (experimentell)
FlexBox ist ein Layout-Container, der für leistungsstarke, adaptive UIs entwickelt wurde. Er verwaltet die Größe von Elementen und die Verteilung des Abstands basierend auf den verfügbaren Containerdimensionen.Er übernimmt komplexe Aufgaben wie das Umbrechen (wrap) und die mehrachsige Ausrichtung von Elementen (justifyContent, alignItems, alignContent). Elemente können vergrößert (grow) oder verkleinert (shrink) werden, um den Container auszufüllen.
@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) }) } }
Weitere Informationen finden Sie in der Dokumentation. Fehler können Sie hier melden.
Neue SlotTable-Implementierung (experimentell)
Wir haben eine neue Implementierung von SlotTable eingeführt, die in diesem Release standardmäßig deaktiviert ist. SlotTable ist die interne Datenstruktur, die von der Compose-Laufzeit verwendet wird, um den Status Ihrer Kompositionshierarchie zu verfolgen, Invalidierungen/Neuzusammensetzungen zu verfolgen, gespeicherte Werte zu speichern und alle Metadaten der Komposition zur Laufzeit zu verfolgen. Diese neue Implementierung wurde entwickelt, um die Leistung zu verbessern, insbesondere bei zufälligen Änderungen.
Wenn Sie die neue SlotTable ausprobieren möchten, aktivieren Sie ComposeRuntimeFlags.isLinkBufferComposerEnabled.
Jetzt mit dem Programmieren beginnen
Mit so vielen neuen APIs in Jetpack Compose und vielen weiteren, die folgen werden, ist jetzt der beste Zeitpunkt, um zu Jetpack Compose zu migrieren.Wie immer freuen wir uns über Ihr Feedback und Ihre Feature-Anfragen (insbesondere zu @Experimental-Funktionen, die sich noch in der Entwicklung befinden). Bitte melden Sie sie hier. Viel Spaß beim Erstellen von Kompositionen!
Weiterlesen
-
Neuigkeiten zum Produkt
Auf der Google I/O 2026 haben wir die Umstellung von Android von einem Betriebssystem zu einem intelligenten System vorgestellt. Außerdem haben wir gezeigt, wie Sie intelligente Nutzererfahrungen nativ mit dem System entwickeln und die Leistungsfähigkeit der KI von Google in Ihre Apps einbinden können.
Jingyu Shi • Lesezeit: 2 Minuten
-
Neuigkeiten zum Produkt
Wir freuen uns, die offizielle Unterstützung für Unreal Engine und Godot für Android XR bekannt zu geben. Außerdem stellen wir neue Tools vor, mit denen Sie Ihre Produktivität steigern und neue XR-Funktionen nutzen können: den Android XR Engine Hub und das Android XR Interaction Framework.
Luke Hopkins, Ryan Bartley • Lesezeit: 4 Minuten
-
Neuigkeiten zum Produkt
Mit der Veröffentlichung von Android 17 stellen wir auf einen adaptiven Entwicklungsstandard um. Ihre Nutzer sind nicht mehr auf einen einzigen Formfaktor angewiesen, sondern wechseln im Laufe des Tages zwischen Smartphones, Foldables, Tablets, Laptops, Displays im Auto und immersiven XR-Umgebungen.
Fahd Imtiaz • Lesezeit: 4 Minuten
Auf dem Laufenden bleiben
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.