Tworzenie prostego widżetu

Widżety aplikacji to miniaturowe widoki aplikacji, które można umieścić w innych takich jak ekran główny – i otrzymują okresowe aktualizacje. Te nazywa się w interfejsie widżetami. Możesz publikować z dostawcą widżetów aplikacji (lub dostawcą widżetów). Komponent aplikacji, który który zawiera inne widżety, jest nazywany hostem widżetu aplikacji (lub hostem widżetów). Rysunek 1 pokazuje widżet próbki muzyki:

Przykład widżetu muzycznego
Rysunek 1. Przykład widżetu muzycznego.

W tym dokumencie opisujemy, jak opublikować widżet, korzystając z jego dostawcy. Dla: szczegółowe informacje o tworzeniu własnego zasobu AppWidgetHost w Więcej informacji o hostowaniu widżetów znajdziesz w artykule Tworzenie hosta widżetów.

Aby dowiedzieć się, jak zaprojektować widżet, zobacz Omówienie widżetów aplikacji.

Komponenty widżetów

Aby utworzyć widżet, potrzebujesz następujących podstawowych komponentów:

AppWidgetProviderInfo obiekt
Opisuje metadane widżetu, np. jego układ, aktualizację częstotliwość i AppWidgetProvider. AppWidgetProviderInfo jest zdefiniowany w pliku XML: opisane w tym dokumencie.
AppWidgetProvider zajęcia
Zdefiniuj podstawowe metody, które umożliwiają programowy interfejs widżet. Dzięki niemu możesz odbierać komunikaty o aktualizacjach widżetu, włączone, wyłączone lub usunięte. Deklarujesz AppWidgetProvider w pliku manifestu, a następnie wdróż go. opisane w tym dokumencie.
Wyświetl układ
Określa początkowy układ widżetu. Układ jest zdefiniowany w XML zgodnie z opisem w tym dokumencie.

Rysunek 2 pokazuje, w jaki sposób te komponenty wpasowują się w ogólny proces przetwarzania widżetów aplikacji przepływu danych.

Proces przetwarzania widżetu aplikacji
Rysunek 2. Proces przetwarzania widżetu aplikacji.
.

Jeśli widżet wymaga konfiguracji użytkownika, wdróż konfigurację widżetu aplikacji działania. Ta aktywność pozwala użytkownikom modyfikować ustawienia widżetów, na przykład strefy czasowej w widżecie zegara.

Zalecamy też wprowadzenie tych ulepszeń: elastyczne układy widżetów, inne ulepszenia, widżety zaawansowane, widżety kolekcji oraz tworzenie widżetów .

Zadeklarowanie pliku XML AppWidgetProviderInfo

Obiekt AppWidgetProviderInfo określa podstawowe cechy widżetu. Zdefiniuj obiekt AppWidgetProviderInfo w pliku zasobów XML za pomocą jednego <appwidget-provider> i zapisz go w folderze res/xml/ projektu.

Widać to w tym przykładzie:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:targetCellWidth="1"
    android:targetCellHeight="1"
    android:maxResizeWidth="250dp"
    android:maxResizeHeight="120dp"
    android:updatePeriodMillis="86400000"
    android:description="@string/example_appwidget_description"
    android:previewLayout="@layout/example_appwidget_preview"
    android:initialLayout="@layout/example_loading_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>

Atrybuty rozmiaru widżetu

Domyślny ekran główny umieszcza widżety w oknie na podstawie siatki komórek o określonej wysokości i szerokości. Większość ekranów głównych pozwala jedynie widżetom rozmiary będące wielokrotnościami całkowitych wielokrotności komórek siatki, np. dwóch komórek. w poziomie o 3 komórki w pionie.

Atrybuty rozmiaru widżetu pozwalają określić domyślny rozmiar widżetu oraz określ dolne i górne granice rozmiaru widżetu. W tym kontekście domyślnym rozmiarem widżetu jest to, kiedy jest otwierany po raz pierwszy dodano do ekranu głównego.

W poniższej tabeli opisano atrybuty <appwidget-provider> dotyczące: do rozmiaru widżetu:

Atrybuty i opis
targetCellWidth i targetCellHeight (Android 12), minWidth i minHeight
  • Począwszy od Androida 12 targetCellWidth i targetCellHeight atrybuty określają domyślny rozmiar widżetu w postaci siatki komórek. Te atrybuty ignorowane w Androidzie 11. i zmniejszyć ją, a można ją zignorować, jeśli ekran główny obsługują układ oparty na siatce.
  • minWidth i Atrybuty minHeight określają domyślny rozmiar widżetu w dp. Jeśli wartości minimalnej szerokości lub wysokości widżetu są różne wymiarów komórek, wartości są zaokrąglane w górę do najbliższy rozmiar komórki.
. Zalecamy określenie obu zestawów atrybuty – targetCellWidth oraz targetCellHeight, minWidth i minHeight, aby aplikacja mogła ponownie używać minWidth i minHeight, jeśli urządzenie użytkownika nie obsługuje targetCellWidth oraz targetCellHeight Jeśli parametr jest obsługiwany, Atrybuty targetCellWidth i targetCellHeight mają pierwszeństwo przed minWidth i minHeight .
minResizeWidth i minResizeHeight Określ bezwzględny minimalny rozmiar widżetu. Wartości te określają rozmiaru, poniżej którego widżet jest nieczytelny lub z innego powodu bezużyteczny. Zastosowanie te atrybuty pozwalają użytkownikowi zmienić rozmiar widżetu na mniejszy niż domyślny rozmiar widżetu. Atrybut minResizeWidth to jest ignorowana, jeśli wartość jest większa niż minWidth lub jest w poziomie zmienianie rozmiaru nie jest włączone. Zobacz resizeMode Podobnie Atrybut minResizeHeight jest ignorowany, jeśli ma wartość większą niż minHeight lub jeśli zmiana rozmiaru w pionie nie jest włączona.
maxResizeWidth i maxResizeHeight Określ zalecany maksymalny rozmiar widżetu. Jeśli wartości nie są wielokrotności wymiarów komórki siatki, są one zaokrąglane w górę do najbliższej rozmiar komórki. Atrybut maxResizeWidth jest ignorowany, jeśli jest mniejsza niż minWidth lub jeśli zmiana rozmiaru w poziomie nie jest . Zobacz resizeMode. Podobnie, atrybut maxResizeHeight jest ignorowany, jeśli ma wartość większą niż minHeight lub jeśli zmiana rozmiaru w pionie jest wyłączona. Wprowadzone w Androidzie 12.
resizeMode Określa reguły, według których można zmieniać rozmiar widżetu. Możesz użyć tej aby zmienić rozmiar widżetów ekranu głównego w poziomie, w pionie lub na obu osiach. Użytkownicy dotykają przycisku & przytrzymaj widżet, aby pokazać uchwyty zmiany rozmiaru. a następnie przeciągnij uchwyty poziome lub pionowe, aby zmienić ich rozmiar układu siatki. Wartości atrybutu resizeMode obejmują: horizontal, vertical i none. Do zadeklarować widżet z możliwością zmiany rozmiaru w pionie i poziomie, użyj horizontal|vertical

Przykład

Aby pokazać, jak atrybuty z poprzedniej tabeli wpływają na rozmiar widżetu, przy założeniu, że masz taką specyfikację:

  • Komórka siatki ma szerokość 30 dp i wysokość 50 dp.
  • Podana specyfikacja atrybutów:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:targetCellWidth="2"
    android:targetCellHeight="2"
    android:minResizeWidth="40dp"
    android:minResizeHeight="40dp"
    android:maxResizeWidth="120dp"
    android:maxResizeHeight="120dp"
    android:resizeMode="horizontal|vertical" />

Od Androida 12:

Używaj atrybutów targetCellWidth i targetCellHeight jako domyślnych i wielkości widżetu.

Domyślny rozmiar widżetu to 2 x 2. Widżet można zmniejszyć do rozmiaru 2x1 lub do 4 x 3.

Android 11 i starsze wersje:

Za pomocą atrybutów minWidth i minHeight oblicz domyślny rozmiar w widżecie.

Domyślna szerokość = Math.ceil(80 / 30) = 3

Wysokość domyślna = Math.ceil(80 / 50) = 2

Domyślny rozmiar widżetu to 3 x 2. Widżet można zmniejszyć do rozmiaru 2x1 lub do pełnego ekranu.

Dodatkowe atrybuty widżetu

W poniższej tabeli opisano atrybuty <appwidget-provider> dotyczące: na wartości inne niż dostosowanie rozmiaru widżetu.

Atrybuty i opis
updatePeriodMillis Określa, jak często platforma widżetów żąda aktualizacji z AppWidgetProvider, wywołując onUpdate() metody wywołania zwrotnego. Nie ma gwarancji, że rzeczywista aktualizacja nastąpi dokładnie o tej wartości. Zalecamy aktualizowanie go także rzadziej, nie częściej niż raz na godzinę, by oszczędzać baterię. Pełną listę uwag na temat wyboru odpowiedniego okresu aktualizacji zobacz Optymalizacje aktualizowania widżetu treści.
initialLayout Wskazuje zasób układu, który definiuje układ widżetu.
configure Definiuje działanie, które ma się uruchamiać, gdy użytkownik doda widżet. i w ten sposób skonfigurować właściwości widżetów. Zobacz Zezwalaj użytkownikom na konfigurowanie widżetów Od Androida 12 aplikacja może pomijać początkowy etap konfiguracji. Patrz sekcja Korzystanie z domyślną konfigurację widżetu, by dowiedzieć się więcej.
description Określa opis, który ma być wyświetlany w selektorze widżetów widżet. Wprowadzone w Androidzie 12.
previewLayout (Android 12) i previewImage (Android 11 i starsze)
  • Począwszy od Androida 12 Atrybut previewLayout określa skalowalny podgląd, który podany jako układ XML z domyślnym rozmiarem widżetu. Najlepiej, kod XML układu określony jako ten atrybut jest tym samym kodem XML układu widżet z realistycznymi wartościami domyślnymi.
  • W Androidzie 11 i starszych wersjach previewImage określa podgląd widżetu, gdy zostanie którą użytkownik widzi po wybraniu widżetu aplikacji. Jeśli nie, użytkownika, zamiast niej użytkownik widzi ikonę programu uruchamiającego aplikację. Ten odpowiada atrybutowi android:previewImage w element <receiver> w parametrze AndroidManifest.xml.
. Uwaga: zalecamy określenie zarówno pola previewImage, i previewLayout, aby aplikacja mogła działać wstecz. do korzystania z previewImage, jeśli urządzenie użytkownika nie obsługuje previewLayout. Więcej informacji: Zgodność wsteczna i skalowalność podgląd widżetów.
autoAdvanceViewId Określa identyfikator widoku podrzędnego widżetu, który jest automatycznie przenoszony przez i host widżetu.
widgetCategory Określa, czy widżet może być wyświetlany na ekranie głównym (home_screen), ekran blokady (keyguard) lub i jednym, i drugim. W przypadku Androida 5.0 lub nowszego prawidłowa jest tylko home_screen.
widgetFeatures Deklaruje funkcje obsługiwane przez widżet. Na przykład: do korzystania z domyślnej konfiguracji widżetu, gdy zostanie dodany przez użytkownika, określ Zarówno configuration_optional oraz reconfigurable flagami. Pomija uruchamianie aktywności konfiguracyjnej po użytkowniku doda widżet. Użytkownik nadal może ponownie skonfigurować widżet później.

Użyj klasy AppWidgetProvider do obsługi komunikatów widżetów

Klasa AppWidgetProvider obsługuje transmisje widżetów i aktualizuje widżet w odpowiedzi na zdarzenia cyklu życia widżetu. W sekcjach poniżej dowiesz się, jak zadeklaruj w pliku manifestu element AppWidgetProvider, a następnie go zaimplementuj.

Zadeklarowanie widżetu w pliku manifestu

Najpierw zadeklaruj klasę AppWidgetProvider w elemencie AndroidManifest.xml aplikacji zgodnie z poniższym przykładem:

<receiver android:name="ExampleAppWidgetProvider"
                 android:exported="false">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

Element <receiver> wymaga atrybutu android:name, który określa element AppWidgetProvider używany przez widżet. Nie można eksportować komponentu. chyba że do urządzenia AppWidgetProvider trzeba przesłać osobny proces, który zwykle nie jest prawdą.

Element <intent-filter> musi zawierać element <action> z parametrem android:name. Ten atrybut określa, że AppWidgetProvider akceptuje ACTION_APPWIDGET_UPDATE. transmisję. To jedyna transmisja, którą musisz wyraźnie zadeklarować. AppWidgetManager automatycznie wysyła wszystkie inne komunikaty widżetów do AppWidgetProvider jako niezbędną.

Element <meta-data> określa zasób AppWidgetProviderInfo i wymaga następujących atrybutów:

  • android:name: określa nazwę metadanych. Używaj android.appwidget.provider, aby zidentyfikować dane jako Deskryptor AppWidgetProviderInfo.
  • android:resource: określa zasób AppWidgetProviderInfo lokalizacji.

Implementowanie klasy AppWidgetProvider

Zajęcia AppWidgetProvider obejmują zakres BroadcastReceiver jako klasa wygody do obsługi komunikatów widżetów. Odbiera tylko zdarzenie komunikaty istotne dla widżetu, na przykład informacje o jego aktualizacji, usunięte, włączone i wyłączone. W przypadku wystąpienia tych transmisji: Metody typu AppWidgetProvider są wywoływane:

onUpdate()
Ta funkcja jest wywoływana, aby aktualizować widżet w odstępach określonych przez tag updatePeriodMillis w AppWidgetProviderInfo. Zobacz tabelę opisujących dodatkowe atrybuty widżetu na tej stronie dla znajdziesz więcej informacji.
.
Metoda ta jest również wywoływana, gdy użytkownik dodaje widżet, więc wykonuje niezbędnej konfiguracji, na przykład przez zdefiniowanie modułów obsługi zdarzeń, View lub uruchamianie zadań, do których mają być wczytywane dane wyświetlane w widżecie. Jeśli jednak zadeklarujesz aktywność związaną z konfiguracją bez flagę configuration_optional, ta metoda nie jest wywoływana, gdy użytkownik dodaje widżet, ale jest wymagany przy kolejnych aktualizacjach. Jest to działania konfiguracji za wykonanie pierwszej aktualizacji, gdy zakończono konfigurację. Więcej informacji znajdziesz w artykule Umożliwianie użytkownikom konfigurowania widżetów aplikacji.
.
Najważniejsze wywołanie zwrotne to onUpdate(). Zapoznaj się z sekcją Obsługiwanie zdarzeń za pomocą onUpdate() zajęcia na tej stronie, aby dowiedzieć się więcej.
onAppWidgetOptionsChanged()

Ta funkcja jest wywoływana przy pierwszym umieszczeniu widżetu i przy każdym zamieszczeniu widżetu rozmiar został zmieniony. Użyj tego wywołania zwrotnego, aby wyświetlić lub ukryć treść na podstawie rozmiaru widżetu zakresów. Sprawdź zakresy rozmiarów, a od Androida 12: listę możliwych rozmiarów instancji widżetu – przez wywołanie getAppWidgetOptions() , który zwraca Bundle zawierający :

onDeleted(Context, int[])

Ta funkcja jest wywoływana za każdym razem, gdy widżet jest usuwany z hosta widżetu.

onEnabled(Context)

Ta funkcja jest wywoływana, gdy wystąpienie widżetu jest tworzone po raz pierwszy. Jeśli na przykład użytkownik doda dwa wystąpienia widżetu, zostanie ona wywołana tylko za pierwszym razem. Jeśli musisz otworzyć nową bazę danych lub przeprowadzić inną konfigurację, musi wystąpić tylko raz dla wszystkich instancji widżetu. Teraz warto aby to zrobić.

onDisabled(Context)

Ta funkcja jest wywoływana, gdy ostatnie wystąpienie widżetu zostanie usunięte z hosta widżetu. Tutaj robisz porządki w aplikacji onEnabled(Context), na przykład przez usunięcie tymczasowej bazy danych.

onReceive(Context, Intent)

Jest ono wywoływane w przypadku każdej transmisji i przed każdym poprzednim wywołaniem zwrotnym . Zwykle nie musisz implementować tej metody, ponieważ domyślna Implementacja AppWidgetProvider filtruje wszystkie komunikaty widżetów i wywołuje metodę poprzednich metod.

Musisz zadeklarować implementację klasy AppWidgetProvider jako transmisję odbiornika za pomocą elementu <receiver> w tabeli AndroidManifest. Przeczytaj sekcję Deklarowanie w pliku manifestu na tej stronie, by dowiedzieć się więcej.

Obsługuj zdarzenia za pomocą klasy onUpdate()

Najważniejsze wywołanie zwrotne AppWidgetProvider to onUpdate(), ponieważ jest jest wywoływana, gdy każdy widżet zostanie dodany do hosta, chyba że zastosujesz konfigurację aktywność bez flagi configuration_optional. Jeśli widżet akceptuje poniższe zdarzenia interakcji użytkownika, a następnie zarejestruj moduły obsługi zdarzeń w tym wywołaniu zwrotnym. Jeśli widżet nie tworzy plików tymczasowych ani baz danych, nie wykonuje też innych działań które wymaga wyczyszczenia, onUpdate() może być jedyną metodą wywołania zwrotnego, do zdefiniowania.

Jeśli na przykład potrzebujesz widżetu z przyciskiem uruchamiającym aktywność, gdy: możesz użyć tej implementacji obiektu AppWidgetProvider:

Kotlin

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity.
            val pendingIntent: PendingIntent = PendingIntent.getActivity(
                    /* context = */ context,
                    /* requestCode = */  0,
                    /* intent = */ Intent(context, ExampleActivity::class.java),
                    /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            )

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            val views: RemoteViews = RemoteViews(
                    context.packageName,
                    R.layout.appwidget_provider_layout
            ).apply {
                setOnClickPendingIntent(R.id.button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

Java

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        for (int i=0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                /* context = */ context,
                /* requestCode = */ 0,
                /* intent = */ intent,
                /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
            );

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

Ten element AppWidgetProvider definiuje tylko metodę onUpdate(), wykorzystującą go do utwórz PendingIntent, który uruchamia Activity i dołącza go do widżetu za pomocą przycisku setOnClickPendingIntent(int, PendingIntent). Zawiera pętlę, która powtarza procedurę dla każdego wpisu w funkcji appWidgetIds, która jest tablicą identyfikatorów identyfikujących każdy widżet utworzony przez u tego dostawcy. Jeśli użytkownik utworzy więcej niż jedno wystąpienie widżetu, wszystkie są aktualizowane jednocześnie. Jednak tylko 1 harmonogram updatePeriodMillis jest zarządzana w przypadku wszystkich instancji widżetu. Jeśli na przykład harmonogram aktualizacji jest zdefiniowana co dwie godziny i zostaje dodane drugie wystąpienie widżetu godzinę po pierwszej, są one aktualizowane w okresie określonym przez pierwszy, a drugi jest ignorowany. Obie aktualizują się co 2 razy godzin, a nie co godzinę.

Zobacz ExampleAppWidgetProvider.java przykładową klasę, aby dowiedzieć się więcej.

Odbieranie intencji transmisji widżetu

AppWidgetProvider to zajęcia wygodne. Jeśli chcesz otrzymać widżet bezpośrednio, możesz wdrożyć własne BroadcastReceiver lub zastąpić onReceive(Context,Intent) oddzwanianie. Intencje, na których musisz się skupić, to :

Tworzenie układu widżetu

Musisz zdefiniować początkowy układ widżetu w formacie XML i zapisać go w katalogu res/layout/ projektu. Przeczytaj artykuł Projektowanie wytycznych.

Tworzenie układu widżetu jest proste, jeśli znasz układy. Pamiętaj jednak, że ten widżet układy oparte na: RemoteViews, który nie obsługuje wszystkich rodzajów układów lub widżetów. Nie możesz używać niestandardowych ustawień lub podklasy widoków obsługiwanych przez funkcję RemoteViews.

RemoteViews obsługuje też ViewStub, czyli niewidoczny element View o zerowym rozmiarze, którego można używać do leniwego rozszerzania układu zasobów w czasie działania.

Obsługa zachowania stanowego

Android 12 obsługuje zachowania stanowe z użyciem tych elementów: istniejące komponenty:

Widżet pozostaje bezstanowy. Aplikacja musi przechowywać informacje o stanie i zarejestrować się w usłudze zdarzenia zmiany stanu.

Przykładowy widżet listy zakupów pokazujący zachowanie stanowe
Rysunek 3. Przykład zachowania stanowego.
.

Poniższy przykładowy kod pokazuje, jak wdrożyć te komponenty.

Kotlin

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2)

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
        R.id.my_checkbox,
        RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent)
)

Java

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true);

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2);

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent));

Udostępnij 2 układy: 1 kierowanie na urządzenia z Androidem 12 lub wyższy w grupie res/layout-v31, a drugie kierowanie obejmuje poprzednie Android 11 lub starszy w domyślnym folderze res/layout.

Stosuj zaokrąglone rogi.

Android 12 wprowadza te parametry systemowe, aby ustawić promienie zaokrąglonych rogów widżetu:

Poniższy przykład przedstawia widżet, który używa funkcji system_app_widget_background_radius w rogu widżetu oraz system_app_widget_inner_radius – widoki w widżecie.

Widżet pokazujący promienie tła widżetu i widoki wewnątrz widżetu
Rysunek 4. Zaokrąglone rogi.

1 Róg widżetu.

2 Róg widoku w widżecie.

Ważne informacje o zaokrąglonych rogach

  • Programy uruchamiające innych firm oraz producenci urządzeń mogą zastąpić system_app_widget_background_radius parametr musi być mniejszy niż 28 dp. Parametr system_app_widget_inner_radius ma zawsze wartość 8 dp mniejszą niż wartość system_app_widget_background_radius.
  • Jeśli widżet nie używa języka @android:id/background lub ma zdefiniowany tło który pozwala wycinać treści na podstawie konspektu – przy użyciu android:clipToOutline ustawiona na true – program uruchamiający automatycznie identyfikuje tło przycina widżet za pomocą prostokąta z zaokrąglonymi rogami do 16 dp. Zapoznaj się z artykułem Sprawdzanie, czy widżet jest zgodny z Android 12.

Aby zapewnić zgodność widżetów z poprzednimi wersjami Androida, zalecamy definiowanie atrybutów niestandardowych i ich zastępowania za pomocą motywu niestandardowego. Androida 12 na przykład w tych przykładowych plikach XML:

/values/attrs.xml

<resources>
  <attr name="backgroundRadius" format="dimension" />
</resources>

/values/styles.xml

<resources>
  <style name="MyWidgetTheme">
    <item name="backgroundRadius">@dimen/my_background_radius_dimen</item>
  </style>
</resources>

/values-31/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="@android:style/Theme.DeviceDefault.DayNight">
    <item name="backgroundRadius">@android:dimen/system_app_widget_background_radius</item>
  </style>
</resources>

/drawable/my_widget_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <corners android:radius="?attr/backgroundRadius" />
  ...
</shape>

/layout/my_widget_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  android:background="@drawable/my_widget_background" />