Aby zacząć udostępniać kafelki z aplikacji, dodaj te zależności do pliku build.gradle
aplikacji.
Odlotowe
dependencies { // Use to implement support for wear tiles implementation "androidx.wear.tiles:tiles:1.4.1" // Use to utilize standard components and layouts in your tiles implementation "androidx.wear.protolayout:protolayout:1.2.1" // Use to utilize components and layouts with Material Design in your tiles implementation "androidx.wear.protolayout:protolayout-material:1.2.1" // Use to include dynamic expressions in your tiles implementation "androidx.wear.protolayout:protolayout-expression:1.2.1" // Use to preview wear tiles in your own app debugImplementation "androidx.wear.tiles:tiles-renderer:1.4.1" // Use to fetch tiles from a tile provider in your tests testImplementation "androidx.wear.tiles:tiles-testing:1.4.1" }
Kotlin
dependencies { // Use to implement support for wear tiles implementation("androidx.wear.tiles:tiles:1.4.1") // Use to utilize standard components and layouts in your tiles implementation("androidx.wear.protolayout:protolayout:1.2.1") // Use to utilize components and layouts with Material Design in your tiles implementation("androidx.wear.protolayout:protolayout-material:1.2.1") // Use to include dynamic expressions in your tiles implementation("androidx.wear.protolayout:protolayout-expression:1.2.1") // Use to preview wear tiles in your own app debugImplementation("androidx.wear.tiles:tiles-renderer:1.4.1") // Use to fetch tiles from a tile provider in your tests testImplementation("androidx.wear.tiles:tiles-testing:1.4.1") }
Kluczowych pojęć
Kafelki nie są tworzone w taki sam sposób jak aplikacje na Androida i korzystają z innych koncepcji:
- Szablony układu:określają ogólne rozmieszczenie elementów wizualnych na ekranie. Do tego służy funkcja
primaryLayout()
. - Elementy układu: reprezentują pojedynczy element graficzny, np. przycisk lub kartę, albo kilka takich elementów zgrupowanych za pomocą kolumny, grupy przycisków lub podobnego elementu. Są one umieszczane w szablonie układu.
- Zasoby: obiekty
ResourceBuilders.Resources
składają się z mapy par klucz-wartość zasobów Androida (obrazów), które są wymagane do renderowania układu, oraz wersji. - Harmonogram: obiekt
TimelineBuilders.Timeline
to lista co najmniej 1 wystąpienia obiektu układu. Możesz stosować różne mechanizmy i wyrażenia, aby wskazać, kiedy renderowanie powinno przejść z jednego obiektu układu na inny, np. aby w określonym momencie przestać wyświetlać dany układ. - Stan: struktura danych typu
StateBuilders.State
, która jest przekazywana między kafelkiem a aplikacją, aby umożliwić tym dwóm komponentom komunikowanie się ze sobą. Jeśli np. użytkownik kliknie przycisk na kafelku, stan będzie zawierać identyfikator tego przycisku. Typy danych możesz też zmieniać na mapie. - Płytka: obiekt
TileBuilders.Tile
reprezentujący płytkę, który składa się z osi czasu, identyfikatora wersji zasobów, interwału świeżości i stanu. - Protolayout: ten termin pojawia się w nazwach różnych klas związanych z kafelkami i odnosi się do biblioteki Protolayout na Wear OS, czyli biblioteki graficznej używanej na różnych platformach Wear OS.
Tworzenie kafelka
Aby udostępnić kafelek z aplikacji, zaimplementuj usługę typu TileService
i zarejestruj ją w pliku manifestu. W tym celu system wysyła żądania dotyczące niezbędnych płytek podczas wywołania onTileRequest()
i zasobów podczas wywołania onTileResourcesRequest()
.
class MyTileService : TileService() { override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( materialScope(this, requestParams.deviceConfiguration) { primaryLayout( mainSlot = { text("Hello, World!".layoutString, typography = BODY_LARGE) } ) } ) ) .build() ) override fun onTileResourcesRequest(requestParams: ResourcesRequest) = Futures.immediateFuture( Resources.Builder().setVersion(RESOURCES_VERSION).build() ) }
Następnie dodaj usługę w tagu <application>
pliku AndroidManifest.xml
.
<service android:name=".snippets.m3.tile.MyTileService" android:label="@string/tile_label" android:description="@string/tile_description" android:icon="@mipmap/ic_launcher" android:exported="true" android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"> <intent-filter> <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" /> </intent-filter> <meta-data android:name="androidx.wear.tiles.PREVIEW" android:resource="@drawable/tile_preview" /> </service>
Filtr uprawnień i intencji rejestruje tę usługę jako dostawcę kafelka.
Ikona, etykieta, opis i zasob do podglądu są wyświetlane użytkownikowi, gdy konfiguruje on karty na telefonie lub zegarku. Pamiętaj, że zasób podglądu obsługuje wszystkie standardowe atrybuty zasobu w Androidzie, więc możesz zmieniać podgląd w zależności od czynników takich jak rozmiar ekranu i język urządzenia. Więcej rekomendacji znajdziesz na liście kontrolnej podglądu.
Wprowadź aplikację i dodaj kartę do karuzeli kart (jest też bardziej przyjazny dla deweloperów sposób wyświetlania podglądu karty, ale na razie wykonaj to ręcznie).

Pełny przykład znajdziesz w przykładowym kodzie na GitHubie lub w laboratorium kodu.
Tworzenie interfejsu dla płytek
Elementy interfejsu użytkownika Material 3 Expressive są tworzone za pomocą ustrukturyzowanego podejścia opartego na wzorze kreatora z zabezpieczeniem typu w języku Kotlin.
Układ
Aby utworzyć układ:
Rozpocznij zakres Material Design: wywołaj funkcję
materialScope()
, podając wymagane parametrycontext
ideviceConfiguration
. Możesz uwzględnić parametry opcjonalne, takie jakallowDynamicTheme
idefaultColorScheme
. WartośćallowDynamicTheme
to domyślnietrue
, a wartośćdefaultColorScheme
toColorScheme
, która jest używana, gdy kolory dynamiczne są niedostępne (np. gdy użytkownik wyłączył tę funkcję lub gdy nie jest ona obsługiwana przez urządzenie albo gdyallowDynamicTheme
tofalse
).Tworzenie interfejsu w ramach zakresu: wszystkie komponenty interfejsu dla danego układu kafelka muszą być zdefiniowane w ramach funkcji lambda w pojedynczym wywołaniu poziomu najwyższego materialScope(). Te funkcje komponentu, takie jak
primaryLayout()
itextEdgeButton()
, są funkcjami rozszerzonymi funkcjiMaterialScope
i są dostępne tylko wtedy, gdy są wywoływane w ramach tego zakresu odbiornika.materialScope( context = context, deviceConfiguration = requestParams.deviceConfiguration, // requestParams is passed to onTileRequest defaultColorScheme = myFallbackColorScheme ) { // inside the MaterialScope, you can call functions like primaryLayout() primaryLayout( titleSlot = { text(text = "Title".layoutString) }, mainSlot = { text(text = "Main Content".layoutString) }, bottomSlot = { textEdgeButton(text = "Action".layoutString) } ) }
Automaty
W M3 układ kafelków wykorzystuje podejście inspirowane Compose, które korzysta z 3 odrębnych miejsc. Od góry do dołu:
titleSlot
, zwykle dla głównego tytułu lub nagłówka.mainSlot
– dla treści głównych.bottomSlot
, często używane do wykonywania czynności lub wyświetlania informacji dodatkowych. Tutaj też pojawia się przycisk krawędzi.

Treść każdego boksu:
titleSlot
(opcjonalnie): zwykle kilka słów wygenerowanych przeztext()
.mainSlot
(obowiązkowo): komponenty uporządkowane w struktury takie jak wiersze, kolumny i grupy przycisków. Te komponenty mogą być też zagnieżdżone w sposób rekurencyjny, np. kolumna może zawierać wiersze.bottomSlot
(opcjonalnie): zwykle wypełnione przyciskiem dopasowanym do krawędzi lub etykietą tekstową.
Ponieważ kafelków nie można przewijać, nie ma komponentów do przewijania stron ani obsługi długich list treści. Zadbaj o to, aby treści były widoczne, gdy rozmiar czcionki zwiększy się lub tekst stanie się dłuższy z powodu tłumaczenia.
Komponenty interfejsu
Biblioteka protolayout-material3
zawiera dużą liczbę komponentów zaprojektowanych zgodnie ze specyfikacją Material 3 Expressive i zaleceniami dotyczącymi interfejsu użytkownika.
Przyciski
- textButton(): przycisk z jednym miejscem na krótki tekst
- iconButton(): przycisk z 1 miejscem na ikonę.
- avatarButton(): przycisk awatara w kształcie pigułki, który zawiera do 3 miejsc na zawartość reprezentującą etykietę ułożoną pionowo i etykietę pomocniczą oraz obraz (awatar) obok
- imageButton(): klikalny przycisk z obrazem, który nie oferuje dodatkowych slotów, tylko obraz (np. backgroundImage jako tło).
- compactButton(): kompaktowy przycisk, który oferuje do 2 miejsc na ułożone poziomo treści reprezentujące ikonę i tekst obok niej
- button(): przycisk w kształcie pigułki, który zawiera maksymalnie 3 miejsca na zawartość reprezentującą etykietę ułożoną pionowo i etykietę pomocniczą oraz ikonę obok
Przyciski krawędziowe
- iconEdgeButton(): przycisk krawędziowy z jednym gniazdem na ikonę lub podobny okrągły, mały element
- textEdgeButton(): przycisk krawędziowy z jednym gniazdem na tekst lub podobnej długości i szerokości treści.
karty;
- titleCard(): karta tytułowa, która zawiera 1–3 miejsca na tekst.
- appCard(): karta aplikacji, która zawiera do 5 miejsc, zwykle tekstowych.
- textDataCard(): karta danych, która zawiera do 3 umieszczonych pionowo slotów, zwykle tekstowych lub liczbowych.
- iconDataCard(): karta danych, która zawiera do 3 umieszczonych pionowo slotów, zwykle z tekstem lub cyframi, z ikoną
- graphicDataCard(): karta danych graficznych, która zawiera miejsce na dane graficzne, takie jak wskaźnik postępu, oraz maksymalnie 2 poziomo ułożone miejsca, zwykle na opisy tekstowe.
Wskaźniki postępu
- circularProgressIndicator(): wskazuje postępy w realizacji celu za pomocą elementu promieniowego.
- segmentedCircularProgressIndicator(): wskazuje postęp w realizacji celu za pomocą elementu radialnego z wyodrębnionymi etapami.
Grupowanie elementów układu
- buttonGroup(): układ komponentu, który umieszcza swoje elementy w układ poziomy
- primaryLayout(): układ pełnoekranowy, który reprezentuje sugerowany styl układu M3, który jest elastyczny i zajmuje się umieszczaniem elementów, wraz z zalecanymi marginesami i odstępami
Motywy
W Material 3 Expressive system kolorów jest zdefiniowany przez 29 standardowych ról kolorów, podzielonych na 6 grup: podstawowych, dodatkowych, trzeciorzędnych, błędów, powierzchni i konturów.

ColorScheme
przypisuje każdemu z tych 29 ról odpowiedni kolor, a ponieważ jest ono częścią MaterialScope
i w jego ramach muszą być tworzone komponenty, automatycznie przypisują one kolory ze schematu. Dzięki temu wszystkie elementy interfejsu użytkownika automatycznie będą zgodne ze standardami Material Design.
Aby umożliwić użytkownikom wybór między zdefiniowanym przez Ciebie schematem kolorów (np. odzwierciedlającym kolory Twojej marki) a tym, który jest dostarczany przez system (na podstawie bieżącej tarczy zegarka użytkownika lub wybranej przez niego), zainicjuj MaterialScope
w ten sposób:
val myColorScheme =
ColorScheme(
primary = ...
onPrimary = ...
// 27 more
)
materialScope(
defaultColorScheme = myColorScheme
) {
// If the user selects "no theme" in settings, myColorScheme is used.
// Otherwise, the system-provided theme is used.
}
Aby wymusić wyświetlanie kafelków w określonym schemacie kolorów, wyłącz obsługę motywów dynamicznych, ustawiając wartość allowDynamicTheme
na false
:
materialScope(
allowDynamicTheme = false,
defaultColorScheme = myColorScheme
) {
// myColorScheme is *always* used.
}
Kolor
Każdy pojedynczy komponent używa podzbioru 29 ról kolorów zdefiniowanych przez ColorScheme
. Na przykład przyciski mogą używać maksymalnie 4 kolorów, które domyślnie są pobierane z grupy „primary” aktywnego ColorScheme
:
Token komponentu ButtonColors |
ColorScheme rola |
---|---|
containerColor | główny |
iconColor | onPrimary |
labelColor | onPrimary |
secondaryLabelColor | onPrimary (nieprzezroczystość 0,8) |
W przypadku niektórych elementów interfejsu użytkownika może być konieczne odstępstwo od domyślnych tokenów kolorów. Możesz na przykład użyć w jednym textEdgeButton
kolorów z grupy „drugorzędnej” lub „trzeciorzędnej” zamiast z grupy „pierwotnej”, aby wyróżnić ten element i uzyskać lepszy kontrast.
Kolory komponentów możesz dostosować na kilka sposobów:
Użyj funkcji pomocniczej do zdefiniowanych kolorów. Aby zastosować standardowe style przycisków w Material 3 Expressive, użyj funkcji pomocniczych, takich jak
filledTonalButtonColors()
. Te funkcje tworzą wstępnie skonfigurowane instancjeButtonColors
, które mapują typowe style, takie jak wypełnione, tonalne lub obrysowane, na odpowiednie role w aktywnejColorScheme
w ramachMaterialScope
. Dzięki temu możesz stosować spójne style bez ręcznego definiowania poszczególnych kolorów w przypadku typowych typów przycisków.textEdgeButton( colors = filledButtonColors() // default /* OR colors = filledTonalButtonColors() */ /* OR colors = filledVariantButtonColors() */ // ... other parameters )
W przypadku kart użyj odpowiednich funkcji z grupy
filledCardColors()
.Jeśli chcesz zmienić tylko 1 lub 2 tokeny, możesz zmodyfikować obiekt
ButtonColors
zwracany przez funkcje pomocnicze, używając metodycopy()
:textEdgeButton( colors = filledButtonColors() .copy( containerColor = colorScheme.tertiary, labelColor = colorScheme.onTertiary ) // ... other parameters )
Wyraźnie określ role kolorów zastępczych. Utwórz własny obiekt
ButtonColors
i przekaż go do komponentu. W przypadku kart użyj obiektuCardColors
.textEdgeButton( colors = ButtonColors( // the materialScope makes colorScheme available containerColor = colorScheme.secondary, iconColor = colorScheme.secondaryDim, labelColor = colorScheme.onSecondary, secondaryLabelColor = colorScheme.onSecondary ) // ... other parameters )
Określ stałe kolory (używaj z zastrzeżeniem). Ogólnie zaleca się określanie kolorów według ich roli semantycznej (np.
colorScheme.primary
), możesz też podać wartości kolorów bezpośrednio. Z tego podejścia należy korzystać oszczędnie, ponieważ może ono prowadzić do niespójności w całości motywu, zwłaszcza jeśli zmienia się on dynamicznie.textEdgeButton( colors = filledButtonColors().copy( containerColor = android.graphics.Color.RED.argb, // Using named colors labelColor = 0xFFFFFF00.argb // Using a hex code for yellow ) // ... other parameters )
Typografia
Aby zapewnić spójność wizualną na platformie Wear OS i zoptymalizować wydajność, cały tekst na kafelkach jest renderowany przy użyciu czcionki dostarczonej przez system. Oznacza to, że kafelki nie obsługują niestandardowych czcionek. W Wear OS 6 lub nowszym jest to czcionka producenta OEM. W większości przypadków będzie to czcionka zmienna, która zapewni bardziej wyraziste wyświetlanie i większą kontrolę.
Aby utworzyć styl tekstu, zwykle używasz metody text()
w połączeniu z konstantami typograficznymi. Ten komponent umożliwia korzystanie z wstępnie zdefiniowanych ról typograficznych w Material 3 Expressive, co pomaga zapewnić kafelkowi zgodność ze sprawdzonymi metodami typograficznymi dotyczącymi czytelności i hierarchii.
Biblioteka zawiera zestaw 18 semantycznych stałych typograficznych, takich jak BODY_MEDIUM. Te stałe wpływają też na inne osie czcionki niż rozmiar.
text(
text = "Hello, World!".layoutString,
typography = BODY_MEDIUM,
)
Aby uzyskać większą kontrolę, możesz ustawić dodatkowe ustawienia. W Wear OS 6 i wyższych wersjach używana jest czcionka zmienna, którą można modyfikować wzdłuż osi kursywa, grubość, szerokość i zaokrąglenie. Możesz sterować tymi osiami za pomocą parametru settings
:
text(
text = "Hello, World".layoutString,
italic = true,
// Use elements defined in androidx.wear.protolayout.LayoutElementBuilders.FontSetting
settings =
listOf(weight(500), width(100F), roundness(100)),
)
Jeśli chcesz kontrolować rozmiar lub odstęp między literami (nie zalecane), użyj funkcji basicText() zamiast funkcji text() i utwórz wartość dla właściwości fontStyle
za pomocą funkcji fontStyle().
Kształt i marginesy
Promień zaokrąglenia rogów możesz zmienić dla prawie każdego komponentu za pomocą właściwości shape
. Wartości pochodzą z właściwości MaterialScope
shapes
:
textButton(
height = expand(),
width = expand(),
shape = shapes.medium, // OR another value like shapes.full
colors = filledVariantButtonColors(),
labelContent = { text("Hello, World!".layoutString) },
)
Jeśli po zmianie kształtu komponentu uważasz, że pozostawia on zbyt dużo lub za mało miejsca na krawędziach wyświetlacza, dostosuj marginesy za pomocą parametru margin
w primaryLayout()
:
primaryLayout(
mainSlot = {
textButton(
shape = shapes.small,
/* ... */
)
},
// margin constants defined in androidx.wear.protolayout.material3.PrimaryLayoutMargins
margins = MAX_PRIMARY_LAYOUT_MARGIN,
)
Łuki
Obsługiwane są te elementy kontenera Arc
:
ArcLine
: powoduje wyświetlenie wygiętej linii wokół łuku.ArcText
: renderowanie zakrzywionego tekstu w elementach łukowych.ArcAdapter
: renderowanie podstawowego elementu układu na łuku, narysowanego wzdłuż łuku dotyczącego.
Więcej informacji znajdziesz w dokumentacji dotyczącej poszczególnych typów elementów.
Modyfikatory
Do każdego dostępnego elementu układu można opcjonalnie zastosować modyfikatory. Używaj tych modyfikatorów w tych celach:
- Zmienianie wizualnego wyglądu układu. Możesz np. dodać tło, obramowanie lub wypełnienie do elementu układu.
- Dodaj metadane dotyczące układu. Możesz na przykład dodać do elementu układu modyfikator semantyczny, aby był on obsługiwany przez czytniki ekranu.
- Dodawanie funkcji. Możesz na przykład dodać do elementu układu modyfikator z możliwością kliknięcia, aby kafelek stał się interaktywny. Więcej informacji znajdziesz w artykule Interakcja z kartami.
Możemy na przykład dostosować domyślny wygląd i metadane Image
,
jak pokazano w tym przykładowym kodzie:
Kotlin
private fun myImage(): LayoutElement = Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(Modifiers.Builder() .setBackground(Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(Padding.Builder().setStart(dp(12f)).build()) .setSemantics(Semantics.builder() .setContentDescription("Image description") .build() ).build() ).build()
Java
private LayoutElement myImage() { return new Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(new Modifiers.Builder() .setBackground(new Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(new Padding.Builder().setStart(dp(12f)).build()) .setSemantics(new Semantics.Builder() .setContentDescription("Image description") .build() ).build() ).build(); }
Rozszerzenia
Spannable
to specjalny typ kontenera, który rozmieszcza elementy w sposób podobny do tekstu. Jest to przydatne, gdy chcesz zastosować inny styl tylko do jednego podciągu w większym bloku tekstu. Nie jest to możliwe w przypadku elementu Text
.
Kontenerek Spannable
jest wypełniony elementami podrzędnymi Span
. Inne podrzędne lub zagnieżdżone instancje Spannable
są niedozwolone.
Istnieją 2 rodzaje elementów podrzędnych Span
:
Możesz na przykład umieścić kursywę w słowie „world” na kafelku „Hello world” i wstawić między słowami obraz, jak w tym przykładzie kodu:
Kotlin
private fun mySpannable(): LayoutElement = Spannable.Builder() .addSpan(SpanText.Builder() .setText("Hello ") .build() ) .addSpan(SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(SpanText.Builder() .setText("world") .setFontStyle(FontStyle.Builder() .setItalic(true) .build()) .build() ).build()
Java
private LayoutElement mySpannable() { return new Spannable.Builder() .addSpan(new SpanText.Builder() .setText("Hello ") .build() ) .addSpan(new SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(new SpanText.Builder() .setText("world") .setFontStyle(newFontStyle.Builder() .setItalic(true) .build()) .build() ).build(); }
Praca z zasobami
Płytki nie mają dostępu do żadnych zasobów aplikacji. Oznacza to, że nie możesz przekazać identyfikatora obrazu Androida do elementu układu Image
i spodziewać się, że zostanie on rozwiązany. Zamiast tego zastąpij metodę onTileResourcesRequest()
i dostarczaj zasoby ręcznie.
Obrazy można przesłać w ramach metody onTileResourcesRequest()
na 2 sposoby:
- Podaj zasób do rysowania za pomocą elementu
setAndroidResourceByResId()
. - Prześlij obraz dynamiczny jako
ByteArray
, używającsetInlineResource()
.
Kotlin
override fun onTileResourcesRequest( requestParams: ResourcesRequest ) = Futures.immediateFuture( Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", ImageResource.Builder() .setAndroidResourceByResId(AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", ImageResource.Builder() .setInlineResource(InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() )
Java
@Override protected ListenableFuture<Resources> onTileResourcesRequest( @NonNull ResourcesRequest requestParams ) { return Futures.immediateFuture( new Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", new ImageResource.Builder() .setAndroidResourceByResId(new AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", new ImageResource.Builder() .setInlineResource(new InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() ); }
Lista kontrolna obrazów podglądu kart
System wyświetla w edytorze karuzeli kafelków obraz podglądu kafelka, na który wskazuje manifest aplikacji na Androida. Ten edytor jest dostępny zarówno na urządzeniach z Wear OS, jak i w aplikacji towarzyszącej na zegarku na telefonach.
Aby pomóc użytkownikom w pełni wykorzystać ten obraz podglądu, sprawdź te informacje o płytce:
- Odzwierciedla najnowszy projekt. Podgląd powinien dokładnie odzwierciedlać najnowszy projekt karty.
- Używa stałego motywu kolorów. Użyj stałego motywu kolorów kafelka, a nie dynamicznego.
- Zawiera ikonę aplikacji. Sprawdź, czy ikona aplikacji znajduje się u góry zdjęcia podglądu.
- Pokazuje stan wczytania/zalogowania. Podgląd powinien wyświetlać w pełni funkcjonalny stan „załadowany” lub „zalogowany”, bez pustych treści ani treści zastępczych.
- Użyj reguł rozwiązywania zasobów do personalizacji (opcjonalnie). Rozważ użycie reguł rozdzielczości zasobów w Androidzie, aby wyświetlać podgląd, który pasuje do ustawień rozmiaru wyświetlacza, języka lub lokalizacji urządzenia. Jest to szczególnie przydatne, jeśli wygląd kafelka różni się na różnych urządzeniach.