Wyświetlanie podglądu UI za pomocą podglądów kompozycyjnych

Element typu „composable” jest definiowany przez funkcję i oznaczony znacznikiem @Composable:

@Composable
fun SimpleComposable() {
    Text("Hello World")
}

Prosty element tekstowy zawierający słowa „Hello
World”.

Aby włączyć podgląd tego elementu, utwórz inny element z adnotacją @Composable i @Preview. Ta nowa, opatrzona adnotacjami kompozycja zawiera teraz kompozycję utworzoną początkowo, SimpleComposable:

@Preview
@Composable
fun SimpleComposablePreview() {
    SimpleComposable()
}

Adnotacja @Preview informuje Android Studio, że ten komponent powinien być wyświetlany w widoku projektu tego pliku. W trakcie wprowadzania zmian możesz na bieżąco sprawdzać zmiany w podglądzie komponentu.

.

GIF pokazujący aktualizacje w czasie rzeczywistym za pomocą Compose

Możesz dodać parametry ręcznie w kodzie, aby dostosować sposób renderowania obiektu @Preview w Android Studio. Możesz nawet dodać adnotację @Preview do tej samej funkcji wiele razy, aby wyświetlić podgląd kompozytowego komponentu z różnymi właściwościami.

Jedną z głównych zalet komponentów @Preview jest to, że nie trzeba polegać na emulatorze w Android Studio. Możesz zaoszczędzić pamięć podczas uruchamiania emulatora, aby wprowadzić ostateczne zmiany w wyglądzie i działaniu, oraz wykorzystać możliwości @Preview do łatwego wprowadzania i testowania drobnych zmian w kodzie.

Aby w pełni wykorzystać adnotację @Preview, zdefiniuj ekrany pod kątem stanu, który jest przekazywany jako dane wejściowe, oraz zdarzeń, które są generowane.

Określ @Preview

Android Studio ma kilka funkcji, które rozszerzają możliwości podglądu kompozycyjnego. Możesz zmienić ich wygląd, wchodzić z nimi w interakcje lub wdrażać je bezpośrednio na emulatorze lub urządzeniu.

Wymiary

Domyślnie wymiary @Preview są wybierane automatycznie do pakowania treści. Aby ustawić wymiary ręcznie, dodaj parametry heightDpwidthDp. Te wartości są już interpretowane jako dp, więc nie musisz dodawać do nich .dp:

@Preview(widthDp = 50, heightDp = 50)
@Composable
fun SquareComposablePreview() {
    Box(Modifier.background(Color.Yellow)) {
        Text("Hello World")
    }
}

Żółty kwadrat z napisem „Hello World”

Podgląd dynamicznych kolorów

Jeśli w aplikacji masz włączone dynamiczne kolory, użyj atrybutu wallpaper, aby przełączać tapety i obserwować, jak interfejs reaguje na tapety wybrane przez różnych użytkowników. Wybierz jeden z motywów tapet dostępnych w klasie Wallpaper. Ta funkcja wymaga wersji Compose 1.4.0 lub nowszej.

Korzystanie z różnych urządzeń

W Android Studio Flamingo możesz edytować parametr device adnotacji podglądu, aby definiować konfiguracje komponentów na różnych urządzeniach.

Przykładowa funkcja składana

Jeśli parametr device zawiera pusty ciąg znaków (@Preview(device = "")), możesz wywołać autouzupełnianie, naciskając Ctrl + Space. Następnie możesz ustawić wartości każdego parametru.

Edycja funkcji próbkującej

W autouzupełnianiu możesz wybrać dowolną opcję urządzenia z listy, np. @Preview(device = "id:pixel_4"). Możesz też podać urządzenie niestandardowe, klikając spec:width=px,height=px,dpi=int…, aby ustawiać indywidualne wartości każdego parametru.

Lista specyfikacji

Aby zastosować, naciśnij Enter, lub anulować za pomocą Esc.

Jeśli ustawisz nieprawidłową wartość, deklaracja zostanie podkreślona na czerwono, a może być dostępna poprawka (Alt + Enter (⌥ + ⏎ w przypadku systemu macOS) > Zastąp przez…). Inspection spróbuje zastosować poprawkę, która najbardziej przypomina Twoje dane wejściowe.

Przykład nieprawidłowej wartości

Język

Aby przetestować różne języki użytkownika, dodaj parametr locale:

@Preview(locale = "fr-rFR")
@Composable
fun DifferentLocaleComposablePreview() {
    Text(text = stringResource(R.string.greeting))
}

Prosty element tekstowy zawierający słowo „bonjour”
i francuską flagę

Ustawianie koloru tła

Domyślnie kompozyt wyświetla się z przezroczystym tłem. Aby dodać tło, dodaj parametry showBackgroundbackgroundColor. Pamiętaj, że backgroundColor to kolor ARGB Long, a nie wartość Color:

@Preview(showBackground = true, backgroundColor = 0xFF00FF00)
@Composable
fun WithGreenBackground() {
    Text("Hello World")
}

Zielony prostokąt z napisami
„Hello World”

interfejs systemu

Jeśli chcesz wyświetlić paski stanu i działania w podglądzie, dodaj parametr showSystemUi:

@Preview(showSystemUi = true)
@Composable
fun DecoratedComposablePreview() {
    Text("Hello World")
}

Okno podglądu z aktywizmem, paskiem stanu i paskiem działań

Tryb interfejsu

Parametr uiMode może przyjmować dowolną z konstant Configuration.UI_*i umożliwia zmianę działania podglądu. Możesz na przykład ustawić tryb nocny na podglądzie, aby sprawdzić, jak zareaguje motyw.

Interfejs podglądu w widoku tworzenia

LocalInspectionMode

Aby sprawdzić, czy kompozyt jest renderowany w podglądzie (w ramach komponentu z możliwością inspekcji), możesz odczytać wartość z elementu LocalInspectionMode CompositionLocal. Jeśli kompozycja jest renderowana na podglądzie, LocalInspectionMode.current zwraca wartość true. Te informacje umożliwiają dostosowanie podglądu. Możesz na przykład wyświetlić w oknie podglądu obraz zastępczy zamiast rzeczywistych danych.

W ten sposób możesz też obejść ograniczenia. na przykład wyświetlanie przykładowych danych zamiast wywoływania żądania sieciowego.

@Composable
fun GreetingScreen(name: String) {
    if (LocalInspectionMode.current) {
        // Show this text in a preview window:
        Text("Hello preview user!")
    } else {
        // Show this text in the app:
        Text("Hello $name!")
    }
}

Wejdź w interakcję z urządzeniem @Preview

Android Studio udostępnia funkcje, które umożliwiają interakcję z zdefiniowanymi podglądami. Ta interakcja pomaga zrozumieć działanie podglądów w czasie działania i ułatwia poruszanie się po interfejsie za pomocą podglądów.

Tryb interaktywny

Tryb interaktywny umożliwia interakcję z podglądem w sposób podobny do tego, jak na urządzeniu z Twoim programem, np. na telefonie lub tablecie. Tryb interaktywny jest izolowany w sandboksie (czyli jest odizolowany od innych podglądów), gdzie możesz klikać elementy i wprowadzać dane użytkownika w podglądzie. To szybki sposób na przetestowanie różnych stanów, gestów, a nawet animacji komponentu.

Gdy użytkownik kliknie przycisk „interaktywny”
w podglądzie,

Film przedstawiający użytkownika w interakcji z podglądem

Nawigacja po kodzie i szkice do skompilowania

Możesz najechać kursorem na podgląd, aby zobaczyć kontury elementów kompozycyjnych zawartych w środku. Kliknięcie zarysu kompozytowego powoduje przejście do definicji w widoku edytora.

Użytkownik najeżdża kursorem na podgląd, przez co Studio wyświetla zarysy komponentów.

Włącz podgląd

Możesz uruchomić określony @Preview w emulatorze lub na fizycznym urządzeniu. Podgląd jest wdrożony w ramach tej samej aplikacji projektu co nowa Activity, więc ma ten sam kontekst i te same uprawnienia. Nie wymaga pisania standardowego kodu z prośbą o uprawnienia, jeśli zostały już one przyznane.

Kliknij ikonę Uruchom podgląd Ikona obok adnotacji @Preview lub u góry podglądu. Android Studio wdroży @Preview na połączonym urządzeniu lub emulatorze.

Gdy użytkownik kliknie na podglądzie przycisk
„Uruchom podgląd”,

Film pokazujący, jak użytkownik
wdraża wersję przedpremierową na urządzeniu

Kopiuj renderowanie @Preview

Każdą wyrenderowaną podglądową kopię można skopiować jako obraz, klikając ją prawym przyciskiem myszy.

klikanie podglądu przez użytkownika,
aby skopiować go jako obraz.

Wiele podglądów tej samej adnotacji @Preview

Możesz prezentować wiele wersji tego samego komponentu @Preview z różnymi specyfikacjami lub różnymi parametrami przekazywanymi do komponentu. Dzięki temu możesz ograniczyć ilość kodu stałego, który w przeciwnym razie musiałbyś napisać.

Szablony z wieloma podglądami

androidx.compose.ui:ui-tooling-preview 1.6.0-alpha01+ wprowadza szablony interfejsu API Multipreview: @PreviewScreenSizes, @PreviewFontScales, @PreviewLightDark i @PreviewDynamicColors, dzięki czemu za pomocą jednego adnotacji możesz wyświetlić podgląd interfejsu tworzenia wiadomości w najczęstszych scenariuszach.

Podgląd różnych czcionek i rozmiarów ekranu za pomocą szablonów

Tworzenie niestandardowych adnotacji dotyczących wielu podglądów

Dzięki funkcji podglądu zbiorczego możesz zdefiniować klasę adnotacji, która zawiera wiele adnotacji @Preview z różnymi konfiguracjami. Dodanie tej adnotacji do funkcji składanej spowoduje automatyczne renderowanie wszystkich podglądów naraz. Możesz na przykład użyć tej adnotacji, aby wyświetlić podgląd wielu urządzeń, rozmiarów czcionek lub motywów jednocześnie bez powtarzania tych definicji dla każdego komponentu.

Zacznij od utworzenia własnej klasy adnotacji niestandardowej:

@Preview(
    name = "small font",
    group = "font scales",
    fontScale = 0.5f
)
@Preview(
    name = "large font",
    group = "font scales",
    fontScale = 1.5f
)
annotation class FontScalePreviews

Możesz użyć tej adnotacji niestandardowej w przypadku elementów kompozycyjnych w wersji testowej:

@FontScalePreviews
@Composable
fun HelloWorldPreview() {
    Text("Hello World")
}

Karta Design w Android Studio, na której widać komponent z małym i dużym fontem

Aby utworzyć pełniejszy zestaw podglądów, możesz połączyć wiele adnotacji z wielokrotnie wyświetlanym podglądem i adnotacji z normalnym podglądem. Połączenie adnotacji w ramach widoku łączonego nie oznacza, że wyświetlane są wszystkie kombinacje. Zamiast tego każda adnotacja w ramach podglądu wielopoziomowego działa niezależnie i renderuje tylko swoje warianty.

@Preview(
    name = "Spanish",
    group = "locale",
    locale = "es"
)
@FontScalePreviews
annotation class CombinedPreviews

@CombinedPreviews
@Composable
fun HelloWorldPreview2() {
    MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } }
}

Karta projektowania w Android Studio, na której widać komponent we wszystkich konfiguracjach

Mieszany podgląd wielu opcji (i normalny podgląd) umożliwia bardziej kompleksowe przetestowanie wielu właściwości w projektach na dużą skalę.

@Preview i duże zbiory danych

Bardzo często zachodzi potrzeba przekazania dużego zbioru danych do podglądu kompozycyjnego. Aby to zrobić, po prostu prześlij przykładowe dane do funkcji Composable Preview, dodając parametr za pomocą adnotacji @PreviewParameter.

@Preview
@Composable
fun UserProfilePreview(
    @PreviewParameter(UserPreviewParameterProvider::class) user: User
) {
    UserProfile(user)
}

Aby podać przykładowe dane, utwórz klasę, która implementuje interfejs PreviewParameterProvider i zwraca dane przykładowe jako sekwencję.

class UserPreviewParameterProvider : PreviewParameterProvider<User> {
    override val values = sequenceOf(
        User("Elise"),
        User("Frank"),
        User("Julia")
    )
}

Powoduje to wyrenderowanie 1 podglądu na element danych w sekwencji:

Podglądy pokazujące Elise, Franka i Julię – elementy kompozytowe

Możesz używać tej samej klasy dostawcy do wielu podglądów. W razie potrzeby ogranicz liczbę podglądów, ustawiając parametr limit.

@Preview
@Composable
fun UserProfilePreview2(
    @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User
) {
    UserProfile(user)
}

Ograniczenia i sprawdzone metody

Android Studio wykonuje kod podglądu bezpośrednio w obszarze podglądu. Nie wymaga uruchamiania emulatora ani urządzenia fizycznego, ponieważ korzysta z przeniesionej części platformy Androida o nazwie Layoutlib. Layoutlib to niestandardowa wersja platformy Android, która została zaprojektowana do działania poza urządzeniami z Androidem. Celem biblioteki jest wyświetlanie w Android Studio podglądu układu, który jest bardzo zbliżony do renderowania na urządzeniach.

Ograniczenia podglądu

Ze względu na sposób renderowania podglądów w Android Studio są one nieskomplikowane i nie wymagają całej platformy Androida do ich renderowania. Ma to jednak pewne ograniczenia:

  • Brak dostępu do sieci
  • Brak dostępu do plików
  • Niektóre interfejsy API Context mogą być niedostępne

Podglądy i ViewModels

Podczas korzystania z funkcji ViewModel w funkcji kompozycji podgląd jest ograniczony. System podglądów nie jest w stanie tworzyć wszystkich parametrów przekazanych do ViewModel, takich jak repozytoria, przypadki użycia czy menedżerowie. Jeśli ViewModel korzysta z wstrzykiwania zależności (np. Hilt), system podglądów nie może utworzyć całego grafu zależności, aby stworzyć ViewModel.

Gdy próbujesz wyświetlić podgląd kompozytowa z ViewModel, Android Studio wyświetla błąd podczas renderowania danego kompozytowa:

Panel problemu w Android Studio z komunikatem „Nie udało się utworzyć instancji `ViewModel`”

Jeśli chcesz wyświetlić podgląd komponentu, który używa komponentu ViewModel, utwórz inny komponent z parametrami z komponentu ViewModel przekazanymi jako argumenty tego komponentu. Dzięki temu nie musisz wyświetlać podglądu komponentu, który korzysta z elementu ViewModel.

@Composable
fun AuthorColumn(viewModel: AuthorViewModel = viewModel()) {
  AuthorColumn(
    name = viewModel.authorName,
    // ViewModel sends the network requests and makes posts available as a state
    posts = viewModel.posts
  )
}

@Preview
@Composable
fun AuthorScreenPreview(
  // You can use some sample data to preview your composable without the need to construct the ViewModel
  name: String = sampleAuthor.name,
  posts: List<Post> = samplePosts[sampleAuthor]
) {
  AuthorColumn(...) {
    name = NameLabel(name),
    posts = PostsList(posts)
  }
}

Klasa adnotacji @Preview

W Android Studio możesz zawsze kliknąć @Preview w Android Studio, aby wyświetlić pełną listę parametrów, które można dostosować podczas dostosowywania podglądu.

annotation class Preview(
    val name: String = "",
    val group: String = "",
    @IntRange(from = 1) val apiLevel: Int = -1,
    val widthDp: Int = -1,
    val heightDp: Int = -1,
    val locale: String = "",
    @FloatRange(from = 0.01) val fontScale: Float = 1f,
    val showSystemUi: Boolean = false,
    val showBackground: Boolean = false,
    val backgroundColor: Long = 0,
    @UiMode val uiMode: Int = 0,
    @Device val device: String = Devices.DEFAULT,
    @Wallpaper val wallpaper: Int = Wallpapers.NONE,
)

Dodatkowe materiały

Więcej informacji o tym, jak Android Studio promuje łatwość obsługi @Preview, i więcej wskazówek na temat narzędzi znajdziesz na blogu Compose Tooling.