Neuigkeiten zum Produkt

Neues in der Jetpack Compose-Version vom April 2026

Lesezeit: 5 Minuten
Meghan Mehta
Developer Advocate, Android

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 haben wir 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 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 vorwärts bewegt 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. Zielgrenzen, 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 der LookaheadAnimationVisualDebugging zusammensetzbaren Funktion. 

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 auf etwas geklickt und es 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 haben wir 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 Touchpads in integrierten Komponenten. So wurden beispielsweise redundante Touch-Slops 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.

beforeAndAfter.webp

Standardeinstellungen für den Kompositionshost (Compose-Laufzeit)

Wir haben HostDefaultProviderLocalHostDefaultProviderHostDefaultKey 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 eine CompositionLocal zu erstellen, die 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, benutzerfreundliche Lösung, die für alle Vorschaufunktionen funktioniert und die Menge an sich wiederholendem Code erheblich 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 Compose 1.10-Blogpost angekündigt, stellen wir Modifier.onFirstVisible() ein. Der Name führte oft zu Missverständnissen, insbesondere in Lazy-Layouts, wo die Funktion beim Scrollen mehrmals ausgelöst wurde. Wir empfehlen, zu Modifier.onVisibilityChanged() zu migrieren. Damit können Sie Sichtbarkeitsstatus manuell genauer verfolgen und an Ihre spezifischen Anwendungsfallanforderungen anpassen.
  • Das Flag ComposeFoundationFlags.isTextFieldDpadNavigationEnabled wurde entfernt, da die Steuerkreuz-Navigation für TextFields jetzt 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 Compose 1.12.0-Version wird compileSdk auf compileSdk 37 aktualisiert. AGP 9 und alle Apps und Bibliotheken, die von Compose abhängig sind, übernehmen diese Anforderung. Wir empfehlen, 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 verschiedene API-Ebenen 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 die frühe Bewertung und Feedback bereitgestellt werden und sich in zukünftigen Versionen 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 traditionell 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",
        )
    }
}
styles.webp

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 den komplexen Abruf von 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 kontextbezogenen Zuständen wie Fenstergröße und Ausrichtung – können Sie hochgradig reaktionsfähige 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. 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 explizit über mehrere Zeilen und Spalten verteilen, um eine präzise Platzierung zu erreichen. 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.

Grid.gif

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 Elementgröße und die Verteilung des Abstands 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) })
    }
}
AnimationGif.gif

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/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 aufregenden 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 senden Sie sie hier. Viel Spaß beim Erstellen von Kompositionen

Verfasst von:

Weiterlesen