Die Jetpack Compose-Version vom April 2026 ist jetzt stabil. Diese Version 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 die heutige Version 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 Aktualisierung der Art und Weise ein, wie Compose die Testzeitplanung verarbeitet. 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 ausgeführt hat, 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 vorgerückt 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 einfacher 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 anschließbare 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 in der neuesten Version 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 wurde beispielsweise die redundante Touch-Slop-Funktion entfernt, eine intuitivere Drag-and-drop-Startgeste eingeführt und die Auswahl durch Doppelklick und Dreifachklick in Textfeldern sowie 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, einschließlich 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 Kotlin Multiplatform besser unterstützt. 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 sich wiederholenden Code deutlich reduziert.
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") } }
Einstellung und Entfernung
- Wie im Blogpost zu Compose 1.10 angekündigt, stellen wir
Modifier.onFirstVisible()ein. 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 Sichtbarkeitsstatus manuell genauer 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 Textes erreicht.
Kommende APIs
In der kommenden Version Compose 1.12.0 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 auf dem neuesten Stand zu bleiben, 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 für eine frühe Bewertung und Feedback bereitgestellt werden und sich in zukünftigen Versionen erheblich ändern oder entfernt werden können.
Stile (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 sie einen Standardsatz von formatierbaren Eigenschaften mit einfachem zustandsbasiertem Styling und animierten Übergängen bietet. Mit dieser neuen API sehen wir bereits vielversprechende Leistungsvorteile. Wir planen, Stile 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. Melden Sie Fehler bitte hier.
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 Neukomposition nur bei Bedarf erfolgt.
Mit Unterstützung für eine Vielzahl von Umgebungssignalen – von Gerätefunktionen wie Tastaturtypen und Zeigergenauigkeit bis hin zu kontextbezogenen Zuständen wie Fenstergröße und -position – können Sie hochgradig reaktionsfähige Benutzeroberflächen erstellen. 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. Melden Sie Fehler bitte hier.
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 präzise über mehrere Zeilen und Spalten verteilen. Das Beste daran ist, dass es sich sehr gut anpasst. 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. Melden Sie Fehler bitte hier.
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 von Abständen basierend auf den verfügbaren Containerdimensionen.Er verarbeitet 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. Melden Sie Fehler bitte hier.
Neue SlotTable-Implementierung (experimentell)
Wir haben eine neue Implementierung von SlotTable eingeführt, die in dieser Version standardmäßig deaktiviert ist. SlotTable ist die interne Datenstruktur, die von der Compose-Laufzeit verwendet wird, um den Status Ihrer Kompositionshierarchie zu verfolgen, Invalidierungen/Neukompositionen zu verfolgen, gespeicherte Werte zu speichern und alle Metadaten der Komposition zur Laufzeit zu verfolgen. Diese neue Implementierung soll die Leistung verbessern, insbesondere bei zufälligen Bearbeitungen.
Wenn Sie die neue SlotTable ausprobieren möchten, aktivieren Sie ComposeRuntimeFlags.isLinkBufferComposerEnabled.
Jetzt mit dem Programmieren beginnen
Mit so vielen aufregenden neuen APIs in Jetpack Compose und vielen weiteren, die folgen werden, war es noch nie ein besserer Zeitpunkt, 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 senden Sie sie hier. Viel Spaß beim Erstellen von Kompositionen!
-
ProduktneuheitenGoogle Play legt größten Wert auf eine sichere Online-Umgebung und den Schutz der Nutzer vor Schaden.
Paul Feng • Lesezeit: 2 Minuten -
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: 5 Minuten -
ProduktneuheitenAndroid Studio Quail 2 ist jetzt stabil und kann in der Produktion verwendet werden. Die IDE bietet jetzt gleichzeitige agentenbasierte Arbeitsabläufe, nativ integrierte Profilerstellung für Speicherlecks und kontextbezogene Fehlerbehebung.
Amman Asfaw • Lesezeit: 3 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.