Wiadomości o usługach
Co nowego w Jetpack Compose w wersji z kwietnia 2026 r.
Czas czytania: 5 minut
Dziś stabilna jest wersja Jetpack Compose z kwietnia 2026 r. Ta wersja zawiera wersję 1.11 podstawowych modułów Compose (pełne mapowanie BoM), narzędzia do debugowania elementów wspólnych, zdarzenia trackpada i inne funkcje. Mamy też kilka eksperymentalnych interfejsów API, które chcielibyśmy, abyś wypróbował(a) i przekazał(a) nam opinię.
Aby korzystać z dzisiejszej wersji, zaktualizuj wersję Compose BOM do:
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Zmiany w Compose 1.11.0
Wykonywanie korutyn w testach
Wprowadzamy ważną aktualizację sposobu, w jaki Compose obsługuje czas testu. Po okresie dobrowolnego przejścia ogłoszonym w Compose 1.10 interfejsy API testowania w wersji 2 są teraz domyślne, a interfejsy API w wersji 1 zostały wycofane. Kluczową zmianą jest przejście na domyślny dyspozytor testów. Interfejsy API w wersji 1 korzystały z UnconfinedTestDispatcher, który natychmiast wykonywał korutyny, a interfejsy API w wersji 2 używają StandardTestDispatcher. Oznacza to, że gdy współprogram zostanie uruchomiony w testach, jest teraz umieszczany w kolejce i nie jest wykonywany, dopóki nie zostanie przesunięty zegar wirtualny.
Dzięki temu lepiej symulowane są warunki produkcyjne, co skutecznie eliminuje warunki wyścigu i sprawia, że pakiet testów jest znacznie bardziej niezawodny i mniej podatny na błędy.
Aby mieć pewność, że testy są zgodne ze standardowym zachowaniem współprogramów, i uniknąć przyszłych problemów ze zgodnością, zdecydowanie zalecamy migrację zestawu testów. Mapowania interfejsów API i typowe poprawki znajdziesz w naszym obszernym przewodniku migracji.
Ulepszenia elementów wspólnych i narzędzia do animacji
Dodaliśmy też przydatne narzędzia do debugowania wizualnego elementów wspólnych i Modifier.animatedBounds. Teraz możesz dokładnie zobaczyć, co się dzieje w tle – np. granice docelowe, trajektorie animacji i liczbę znalezionych dopasowań. Dzięki temu łatwiej zauważysz, dlaczego przejście może nie działać zgodnie z oczekiwaniami. Aby korzystać z nowych narzędzi, po prostu otocz element SharedTransitionLayout elementem kompozycyjnym LookaheadAnimationVisualDebugging.
LookaheadAnimationVisualDebugging( overlayColor = Color(0x4AE91E63), isEnabled = true, multipleMatchesColor = Color.Green, isShowKeylabelEnabled = false, unmatchedElementColor = Color.Red, ) { SharedTransitionLayout { CompositionLocalProvider( LocalSharedTransitionScope provides this, ) { // your content } } }
Zdarzenia touchpada
Ulepszyliśmy obsługę touchpadów w Compose, takich jak wbudowane touchpady w laptopach, touchpady dołączane do tabletów oraz touchpady zewnętrzne i wirtualne. Podstawowe zdarzenia touchpada będą teraz ogólnie traktowane jako zdarzenia PointerType.Mouse, co spowoduje, że zachowanie myszy i touchpada będzie lepiej odpowiadać oczekiwaniom użytkowników. Wcześniej te zdarzenia touchpada były interpretowane jako fałszywe palce dotykowe PointerType.Touch, co prowadziło do mylących wrażeń użytkownika. Na przykład kliknięcie i przeciągnięcie za pomocą touchpada powodowało przewijanie zamiast zaznaczania. Dzięki zmianie typu wskaźnika, który mają te zdarzenia w najnowszej wersji Compose, kliknięcie i przeciągnięcie za pomocą touchpada nie będzie już powodować przewijania.
Dodaliśmy też obsługę bardziej skomplikowanych gestów touchpada rozpoznawanych przez platformę od interfejsu API 34, w tym przesunięć dwoma palcami i uszczypnięć. Te gesty są automatycznie rozpoznawane przez komponenty takie jak Modifier.scrollable i Modifier.transformable, co zapewnia lepsze działanie z touchpadami.
Te zmiany poprawiają działanie touchpadów w przypadku wbudowanych komponentów, usuwając zbędne marginesy dotykowe, wprowadzając bardziej intuicyjny gest przeciągania i upuszczania, wybieranie przez dwukrotne i trzykrotne kliknięcie w polach tekstowych oraz menu kontekstowe w polach tekstowych w stylu komputerowym.
Aby przetestować działanie touchpada, dostępne są nowe interfejsy API testowania z performTrackpadInput, które umożliwiają sprawdzenie działania aplikacji podczas korzystania z touchpada. Jeśli masz niestandardowe detektory gestów, sprawdź ich działanie w przypadku różnych typów danych wejściowych, w tym ekranów dotykowych, myszy, touchpadów i rysików, oraz upewnij się, że obsługują one kółka myszy i gesty touchpada.
Domyślne ustawienia hosta kompozycji (środowisko wykonawcze Compose)
Wprowadziliśmy HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey i ViewTreeHostDefaultKey, aby udostępniać usługi na poziomie hosta bezpośrednio za pomocą środowiska wykonawczego Compose. Dzięki temu biblioteki nie muszą już zależeć od compose-ui w przypadku wyszukiwania, co zapewnia lepszą obsługę Kotlin Multiplatform. Aby powiązać te wartości z drzewem kompozycji, autorzy bibliotek mogą użyć compositionLocalWithHostDefaultOf do utworzenia CompositionLocal, który rozwiązuje wartości domyślne z hosta.
Otoczki podglądu
Niestandardowe podglądy w Android Studio to nowa funkcja, która umożliwia dokładne określenie sposobu wyświetlania zawartości podglądu Compose.
Implementując interfejs PreviewWrapperProvider i stosując nową adnotację @PreviewWrapper, możesz łatwo wstrzyknąć niestandardową logikę, np. zastosować określony Theme. Adnotację można zastosować do funkcji oznaczonej adnotacjami @Composable i @Preview lub @MultiPreview, co zapewnia ogólne, łatwe w użyciu rozwiązanie, które działa w przypadku funkcji podglądu i znacznie zmniejsza ilość powtarzającego się kodu.
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") } }
Wycofania i usunięcia
- Zgodnie z zapowiedzią w poście na blogu o Compose 1.10 wycofujemy
Modifier.onFirstVisible(). Jej nazwa często prowadziła do nieporozumień, zwłaszcza w przypadku układów leniwych, gdzie była wywoływana wielokrotnie podczas przewijania. Zalecamy migrację doModifier.onVisibilityChanged(), która umożliwia dokładniejsze ręczne śledzenie stanów widoczności dostosowanych do konkretnych wymagań. - Flaga
ComposeFoundationFlags.isTextFieldDpadNavigationEnabledzostała usunięta, ponieważ nawigacja za pomocą pada kierunkowego w przypadkuTextFieldsjest teraz domyślnie zawsze włączona. Nowe zachowanie zapewnia, że zdarzenia pada kierunkowego z gamepada lub pilota do telewizora najpierw przesuwają kursor w danym kierunku. Fokus może przejść do innego elementu tylko wtedy, gdy kursor dotrze do końca tekstu.
Nadchodzące interfejsy API
W nadchodzącej wersji Compose 1.12.0 compileSdk zostanie zaktualizowany do compileSdk 37, a AGP 9 oraz wszystkie aplikacje i biblioteki, które zależą od Compose, będą dziedziczyć to wymaganie. Zalecamy korzystanie z najnowszych opublikowanych wersji, ponieważ Compose ma na celu szybkie wdrażanie nowych compileSdks, aby zapewnić dostęp do najnowszych funkcji Androida. Więcej informacji o tym, która wersja AGP jest obsługiwana w przypadku różnych poziomów interfejsu API, znajdziesz w dokumentacji.
W Compose 1.11.0 wprowadzamy te interfejsy API jako @Experimental. Czekamy na Twoją opinię, gdy będziesz je testować w swoich aplikacjach. Pamiętaj, że @Experimental APIs są udostępniane do wczesnej oceny i przekazywania opinii. W przyszłych wersjach mogą ulec znacznym zmianom lub zostać usunięte.
Style (wersja eksperymentalna)
Wprowadzamy nowy eksperymentalny interfejs API podstawowy do stylizowania. Interfejs Style API to nowy paradygmat dostosowywania wizualnych elementów komponentów, który tradycyjnie był realizowany za pomocą modyfikatorów. Został zaprojektowany tak, aby umożliwiać głębsze i łatwiejsze dostosowywanie przez udostępnianie standardowego zestawu właściwości, które można stylizować, z prostym stylizowaniem opartym na stanie i animowanymi przejściami. Dzięki temu nowemu interfejsowi API widzimy już obiecujące korzyści w zakresie wydajności. Planujemy wdrożyć style w komponentach Material, gdy interfejs Style API będzie stabilny.
Podstawowy przykład zastępowania tła stylu stanu naciśnięcia:
@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", ) } }
Zapoznaj się z dokumentacją i zgłoś błędy tutaj.
MediaQuery (wersja eksperymentalna)
Nowy interfejs API mediaQuery zapewnia deklaratywny i wydajny sposób dostosowywania interfejsu do jego środowiska. Abstrahuje on złożone pobieranie informacji do prostych warunków w UiMediaScope, dzięki czemu ponowna kompozycja następuje tylko wtedy, gdy jest to konieczne.
Dzięki obsłudze szerokiego zakresu sygnałów środowiskowych – od możliwości urządzenia, takich jak typy klawiatur i precyzja wskaźnika, po stany kontekstowe, takie jak rozmiar okna i pozycja – możesz tworzyć bardzo elastyczne aplikacje. Wydajność jest wbudowana w derivedMediaQuery, aby obsługiwać aktualizacje o wysokiej częstotliwości, a możliwość zastępowania zakresów sprawia, że testowanie i podglądy są bezproblemowe w różnych konfiguracjach sprzętowych. Wcześniej, aby uzyskać dostęp do niektórych właściwości urządzenia – np. czy urządzenie jest w trybie tabletop – trzeba było napisać dużo kodu:
@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() } }
Teraz dzięki UIMediaQuery możesz dodać składnię mediaQuery, aby wysyłać zapytania o właściwości urządzenia, np. czy urządzenie jest w trybie tabletop:
@OptIn(ExperimentalMediaQueryApi::class) @Composable fun VideoPlayer() { if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) { TabletopLayout() } else { FlatLayout() } }
Zapoznaj się z dokumentacją i zgłoś błędy tutaj.
Grid (wersja eksperymentalna)
Grid to nowy, zaawansowany interfejs API do tworzenia złożonych układów dwuwymiarowych w Jetpack Compose. Chociaż Row i Column świetnie sprawdzają się w przypadku projektów liniowych, Grid zapewnia kontrolę strukturalną potrzebną do architektury na poziomie ekranu i złożonych komponentów bez obciążenia związanego z przewijaną listą. Grid umożliwia definiowanie układu za pomocą ścieżek, odstępów i komórek, oferując znane opcje rozmiaru, takie jak Dp, procenty, rozmiary treści wewnętrznej i elastyczne jednostki „Fr”.
@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() } }
Możesz umieszczać elementy automatycznie lub jawnie rozciągać je na wiele wierszy i kolumn, aby uzyskać precyzję. Co najważniejsze, jest on bardzo elastyczny – możesz dynamicznie zmieniać konfigurację ścieżek i zakresów siatki, aby reagować na stany urządzenia, takie jak tryb tabletop lub zmiany orientacji, dzięki czemu interfejs będzie wyglądać świetnie na różnych urządzeniach.
Zapoznaj się z dokumentacją i zgłoś błędy tutaj.
FlexBox (wersja eksperymentalna)
FlexBox to kontener układu zaprojektowany z myślą o wysokiej wydajności i elastycznych interfejsach. Zarządza on rozmiarem elementów i rozmieszczeniem przestrzeni na podstawie dostępnych wymiarów kontenera.Obsługuje złożone zadania, takie jak zawijanie (wrap) i wyrównywanie elementów w wielu osiach (justifyContent, alignItems, alignContent). Umożliwia powiększanie (grow) lub zmniejszanie (shrink) elementów, aby wypełnić kontener.
@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) }) } }
Zapoznaj się z dokumentacją i zgłoś błędy tutaj.
Nowa implementacja SlotTable (wersja eksperymentalna)
Wprowadziliśmy nową implementację SlotTable, która jest domyślnie wyłączona w tej wersji. SlotTable to wewnętrzna struktura danych, której środowisko wykonawcze Compose używa do śledzenia stanu hierarchii kompozycji, śledzenia unieważnień i ponownych kompozycji, przechowywania zapamiętanych wartości oraz śledzenia wszystkich metadanych kompozycji w czasie działania. Ta nowa implementacja ma na celu zwiększenie wydajności, przede wszystkim w przypadku losowych edycji.
Aby wypróbować nowy SlotTable, włącz ComposeRuntimeFlags.isLinkBufferComposerEnabled.
Zacznij kodować już dziś!
Dzięki tak wielu nowym, ciekawym interfejsom API w Jetpack Compose i wielu innym, które są w przygotowaniu, migracja do Jetpack Compose nigdy nie była tak korzystna.Jak zawsze, cenimy Twoją opinię i prośby o funkcje (zwłaszcza w przypadku @Experimental funkcji, które są jeszcze w fazie testów) – zgłaszaj je tutaj. Miłego tworzenia!
Czytaj dalej
-
Wiadomości o usługach
Podczas tegorocznej konferencji Google I/O mówiliśmy o naszym zmieniającym się modelu biznesowym, który oferuje większy wybór i nowe sposoby na to, aby Twoje aplikacje i treści były odkrywane w Sklepie Play i poza nim. Przedstawiliśmy też zaawansowane narzędzia i statystyki, które pomogą Ci rozwijać firmę przy mniejszym nakładzie pracy.
Paul Feng • Czas czytania: 6 minut
-
Wiadomości o usługach
Z przyjemnością informujemy, że w Androidzie XR pojawiła się oficjalna obsługa Unreal Engine i Godot. Uruchamiamy też nowe narzędzia, które mają zwiększyć Twoją produktywność i umożliwić korzystanie z nowych funkcji XR: Android XR Engine Hub i Android XR Interaction Framework.
Luke Hopkins • Czas czytania: 4 minuty
-
Wiadomości o usługach
Z przyjemnością udostępniamy funkcje Google TV i narzędzia dla deweloperów, które mają zwiększyć widoczność Twoich treści i przygotować aplikację na przyszłe funkcje telewizora.
Paul Lammertsma • Czas czytania: 4 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.