Produktneuigkeiten

Neuerungen im Jetpack Compose-Release vom April 2026

Lesezeit: 6 Minuten
Profil von Meghan Mehta ansehen
Meghan Mehta Developer Advocate, Android

Heute ist die Jetpack Compose-Version von April 2026 stabil. Diese Version enthält Version 1.11 der wichtigsten Compose-Module (siehe vollständige BOM-Zuordnung), Debugging-Tools für freigegebene Elemente, Trackpad-Ereignisse und mehr. Wir haben auch einige experimentelle APIs, die Sie 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

Koroutinen in Tests ausführen

Wir führen ein wichtiges Update ein, das die Handhabung des Test-Timings in Compose betrifft. Nach dem in Compose 1.10 angekündigten Opt-in-Zeitraum sind die v2-Test-APIs jetzt die Standard-APIs und die v1-APIs wurden eingestellt. Die wichtigste Änderung ist eine Änderung des Standard-Test-Dispatchers. Während die v1 APIs auf dem UnconfinedTestDispatcher basierten, der Koroutinen sofort ausführte, verwenden die v2 APIs den StandardTestDispatcher. Das bedeutet, dass eine Coroutine, die in Ihren Tests gestartet wird, jetzt in die Warteschlange gestellt und erst ausgeführt wird, wenn die virtuelle Uhr weiterläuft.

Dadurch werden die Produktionsbedingungen besser nachgeahmt, Race-Bedingungen werden effektiv beseitigt und Ihre Test-Suite wird 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 unserer umfassenden Migrationsanleitung finden Sie API-Zuordnungen und gängige Lösungen.

Verbesserungen bei freigegebenen Elementen und Animationstools

Außerdem haben wir einige praktische visuelle Debugging-Tools für freigegebene Elemente und Modifier.animatedBounds hinzugefügt. Sie können jetzt genau sehen, was im Hintergrund passiert, z. B. Zielgrenzen, Animationsverläufe und die Anzahl der gefundenen Übereinstimmungen. So lässt sich viel einfacher erkennen, warum ein Übergang möglicherweise nicht wie erwartet funktioniert. Wenn Sie die neuen Tools verwenden möchten, müssen Sie Ihr SharedTransitionLayout einfach mit der zusammensetzbaren Funktion LookaheadAnimationVisualDebugging umschließen. 

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 Unterstützung von Trackpads in Compose überarbeitet, z. B. für integrierte Laptop-Trackpads, anbringbare Trackpads für Tablets oder externe/virtuelle Trackpads. Einfache Trackpad-Ereignisse werden jetzt im Allgemeinen als PointerType.Mouse-Ereignisse betrachtet. Dadurch werden Maus- und Trackpad-Verhalten besser an die Erwartungen der Nutzer angepasst. Bisher wurden diese Trackpad-Ereignisse als gefälschte Touchscreen-Finger von PointerType.Touch interpretiert, was zu einer verwirrenden Nutzererfahrung führte. Wenn Sie beispielsweise mit einem Trackpad klicken und ziehen, wird gescrollt, anstatt etwas auszuwählen. Durch die Änderung des Zeigertyps für diese Ereignisse in der neuesten Version von Compose wird durch Klicken und Ziehen mit einem Trackpad nicht mehr gescrollt.

Außerdem haben wir Unterstützung für komplexere Trackpad-Gesten hinzugefügt, die seit API 34 von der Plattform erkannt werden, darunter Wischbewegungen mit zwei Fingern und Auseinander- und Zusammenziehen von Fingern. Diese Gesten werden von Komponenten wie Modifier.scrollable und Modifier.transformable automatisch erkannt, um das Verhalten mit Trackpads zu verbessern.

Diese Änderungen verbessern das Verhalten von Trackpads in integrierten Komponenten. Redundante Touch-Slop-Werte wurden entfernt, die Startgeste für Drag-and-Drop ist intuitiver, die Auswahl in Textfeldern erfolgt per Doppelklick und Dreifachklick und die Kontextmenüs in Textfeldern sind im Desktop-Stil gehalten.

Zum Testen des Trackpad-Verhaltens gibt es neue Test-APIs mit performTrackpadInput,, mit denen Sie das Verhalten Ihrer Apps bei Verwendung mit einem Trackpad prüfen können. Wenn Sie benutzerdefinierte Gestendetektoren haben, prüfen Sie das Verhalten bei verschiedenen Eingabetypen, einschließlich Touchscreens, Mäusen, Trackpads und Eingabestiften, und sorgen Sie für die Unterstützung von Maus-Scrollrädern und Trackpad-Gesten.

beforeAndAfter.webp

Standardeinstellungen für den Kompositionshost (Compose-Laufzeit)

Wir haben HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey und ViewTreeHostDefaultKey eingeführt, um Dienste auf Hostebene direkt über compose-runtime bereitzustellen. Dadurch müssen Bibliotheken für Suchvorgänge nicht mehr von compose-ui abhängig sein, was die Unterstützung von Kotlin Multiplatform verbessert. Um diese Werte mit der Baumstruktur der Komposition zu verknüpfen, können Bibliotheksautoren mit compositionLocalWithHostDefaultOf ein CompositionLocal erstellen, das Standardwerte vom Host auflöst.

Vorschau von Wrappern

Benutzerdefinierte Vorschauen in Android Studio ist eine neue Funktion, mit der Sie genau festlegen können, wie die Inhalte einer Compose-Vorschau angezeigt werden.

Wenn Sie die Schnittstelle PreviewWrapperProvider implementieren und die neue Annotation @PreviewWrapper anwenden, können Sie ganz einfach benutzerdefinierte Logik einfügen, z. B. eine bestimmte Theme anwenden. Die Annotation kann auf eine Funktion angewendet werden, die mit @Composable und @Preview oder @MultiPreview annotiert ist. Sie bietet eine allgemeine, einfach zu verwendende Lösung, die für alle Funktionen in der Vorabversion funktioniert und sich wiederholenden Code erheblich 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")
    }
}

Einstellungen und Entfernungen

  • Wie im Blogpost zu Compose 1.10 angekündigt, wird Modifier.onFirstVisible() eingestellt. Der Name hat oft zu Missverständnissen geführt, insbesondere bei Lazy Layouts, bei denen er beim Scrollen mehrmals ausgelöst wurde. Wir empfehlen die Migration zu Modifier.onVisibilityChanged(), da Sie damit Sichtbarkeitsstatus manuell und präziser erfassen können, was auf die Anforderungen Ihres spezifischen Anwendungsfalls zugeschnitten ist.
  • Das Flag ComposeFoundationFlags.isTextFieldDpadNavigationEnabled wurde entfernt, da die Steuerkreuznavigation für TextFields jetzt standardmäßig immer aktiviert ist. Durch das neue Verhalten wird sichergestellt, dass die Steuerkreuz-Ereignisse von einem Gamepad oder einer TV-Fernbedienung den Cursor zuerst in die angegebene Richtung bewegen. Der Fokus kann erst dann auf ein anderes Element verschoben werden, wenn der Cursor das Ende des Textes erreicht hat.

Anstehende APIs

In der kommenden Compose-Version 1.12.0 wird die compileSdk auf compileSdk 37 aktualisiert. AGP 9 und alle Apps und Bibliotheken, die von Compose abhängen, übernehmen diese Anforderung. Wir empfehlen, immer die neuesten Versionen zu verwenden, da Compose darauf abzielt, neue compileSdks-Versionen zeitnah zu übernehmen, um Zugriff auf die neuesten Android-Funktionen zu bieten. In der Dokumentation hier finden Sie weitere Informationen dazu, welche AGP-Version für die verschiedenen API-Level unterstützt wird. 

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. @Experimental APIs werden für eine frühzeitige Bewertung und Feedback bereitgestellt und können in zukünftigen Releases erheblich geändert oder entfernt werden.

Stile (experimentell)

Wir führen eine neue experimentelle Foundation API für das Styling ein. Die Style API ist ein neues Paradigma zum Anpassen visueller Elemente von Komponenten, was bisher mit Modifikatoren erfolgte. Sie ermöglicht eine umfassendere und einfachere Anpassung, da sie einen Standardsatz von anpassbaren Eigenschaften mit einfachem statusbasiertem 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.

Hier ein einfaches Beispiel für das Überschreiben des Hintergrunds für den Status „Gedrückt“:

@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

Sehen Sie sich die Dokumentation an und melden Sie Fehler hier.

MediaQuery (experimentell)

Die neue mediaQuery API bietet eine deklarative und leistungsstarke Möglichkeit, die Benutzeroberfläche an die Umgebung anzupassen. Sie abstrahiert den komplexen Informationsabruf in einfache Bedingungen innerhalb eines UiMediaScope, sodass die Neuzusammensetzung nur bei Bedarf erfolgt.

Dank der Unterstützung einer Vielzahl von Umgebungssignalen – von Gerätefunktionen wie Tastaturtypen und Zeigerpräzision bis hin zu Kontextzuständen wie Fenstergröße und -position – können Sie hochgradig responsive Erlebnisse schaffen. Die Leistung ist mit derivedMediaQuery integriert, um hochfrequente Updates zu verarbeiten. Die Möglichkeit, Bereiche zu überschreiben, ermöglicht nahtlose Tests und Vorabversionen über verschiedene Hardwarekonfigurationen hinweg. Bisher musstet ihr viel Boilerplate-Code schreiben, um auf bestimmte Geräteeigenschaften zuzugreifen, z. B. ob sich ein Gerät im Modus „Auf dem Tisch“ 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 kannst du jetzt die Syntax mediaQuery hinzufügen, um Geräteeigenschaften abzufragen, z. B. ob sich ein Gerät im Modus „Auf dem Tisch“ befindet:

@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
    if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

Sehen Sie sich die Dokumentation an und melden Sie Fehler hier.

Raster (experimentell)

Grid ist eine leistungsstarke neue API zum Erstellen komplexer, zweidimensionaler Layouts in Jetpack Compose. Row und Column eignen sich hervorragend für lineare Designs. Grid bietet Ihnen jedoch die strukturelle Kontrolle, die Sie für die Architektur auf Bildschirmebene und komplexe Komponenten benötigen, ohne den Aufwand einer scrollbaren Liste. Mit Grid können Sie Ihr Layout mithilfe von Tracks, Lücken und Zellen definieren. Dabei stehen Ihnen vertraute Größenoptionen wie Dp, Prozentsätze, intrinsische Inhaltsgrößen und flexible „Fr“-Einheiten zur Verfügung. 

@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 sich sehr gut anpassen lässt. Sie können Ihre Rasterspuren und -spannen dynamisch neu konfigurieren, um auf Gerätestatus wie den Modus „Auf dem Tisch“ oder Änderungen der Ausrichtung zu reagieren. So sieht Ihre Benutzeroberfläche auf allen Formfaktoren gut aus.

Grid.gif

Sehen Sie sich die Dokumentation an und melden Sie Fehler hier. 

FlexBox (experimentell)

FlexBox ist ein Layoutcontainer, der für leistungsstarke, adaptive Benutzeroberflächen entwickelt wurde. Sie verwaltet die Größe der Elemente und die Platzverteilung basierend auf den verfügbaren Containerdimensionen.  Es 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 zu fü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) })
    }
}
AnimationGif.gif

Sehen Sie sich die Dokumentation an und melden Sie Fehler 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, Entwertungen/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 Änderungen.

Wenn Sie die neue SlotTable-Version ausprobieren möchten, aktivieren Sie ComposeRuntimeFlags.isLinkBufferComposerEnabled. 

Jetzt loslegen!

Mit so vielen spannenden neuen APIs in Jetpack Compose und vielen weiteren, die noch kommen, ist jetzt der beste Zeitpunkt, um zu Jetpack Compose zu migrieren.  Wie immer freuen wir uns über Feedback und Feature Requests (insbesondere zu @Experimental-Funktionen, die sich noch in der Entwicklung befinden). Du kannst sie hier einreichen. Viel Spaß beim Komponieren!

Verfasst von:
Weiterlesen