Einfaches Widget erstellen

App-Widgets sind Miniaturansichten von Apps, die Sie in andere Apps einbetten können, z. B. in den Startbildschirm, und die regelmäßig aktualisiert werden. Diese Ansichten werden auf der Benutzeroberfläche als Widgets bezeichnet. Sie können sie bei einem App-Widget-Anbieter (Widget-Anbieter) veröffentlichen. Eine App-Komponente, die andere Widgets enthält, wird als App-Widget-Host (oder Widget-Host) bezeichnet. Abbildung 1 zeigt ein Beispiel für ein Musik-Widget:

Beispiel für ein Musik-Widget
Abbildung 1: Beispiel für ein Musik-Widget.

In diesem Dokument wird beschrieben, wie Sie ein Widget mithilfe eines Widget-Anbieters veröffentlichen. Weitere Informationen zum Erstellen eines eigenen AppWidgetHost zum Hosten von App-Widgets finden Sie unter App-Widget-Host erstellen.

Informationen zum Entwerfen Ihres Widgets finden Sie unter App-Widgets.

Widget-Komponenten

Zum Erstellen eines Widgets benötigen Sie die folgenden grundlegenden Komponenten:

AppWidgetProviderInfo-Objekt
Beschreibt die Metadaten für ein Widget, z. B. das Layout, die Aktualisierungshäufigkeit und die AppWidgetProvider-Klasse des Widgets. AppWidgetProviderInfo ist in XML definiert, wie in diesem Dokument beschrieben.
AppWidgetProvider-Klasse
Definiert die grundlegenden Methoden, mit denen Sie programmatisch mit dem Widget interagieren können. Über diesen Dienst erhalten Sie Benachrichtigungen, wenn das Widget aktualisiert, aktiviert, deaktiviert oder gelöscht wird. Sie deklarieren AppWidgetProvider im Manifest und implementieren es dann wie in diesem Dokument beschrieben.
Layout ansehen
Definiert das ursprüngliche Layout für das Widget. Das Layout wird in XML definiert, wie in diesem Dokument beschrieben.

In Abbildung 2 sehen Sie, wie sich diese Komponenten in den gesamten Verarbeitungsablauf des App-Widgets einfügen.

Verarbeitungsablauf des App-Widgets
Abbildung 2: Ablauf der App-Widget-Verarbeitung

Wenn für Ihr Widget eine Nutzerkonfiguration erforderlich ist, implementieren Sie die Aktivität „App-Widget konfigurieren“. Bei dieser Aktivität können Nutzer Widget-Einstellungen ändern, z. B. die Zeitzone für ein Uhren-Widget.

Außerdem empfehlen wir die folgenden Verbesserungen: flexible Widget-Layouts, Verschiedene Verbesserungen, erweiterte Widgets, Sammlungs-Widgets und Widget-Host erstellen.

AppWidgetProviderInfo-XML-Datei deklarieren

Das AppWidgetProviderInfo-Objekt definiert die wesentlichen Eigenschaften eines Widgets. Definieren Sie das AppWidgetProviderInfo-Objekt in einer XML-Ressourcendatei mit einem einzelnen <appwidget-provider>-Element und speichern Sie es im res/xml/-Ordner des Projekts.

Dies wird im folgenden Beispiel gezeigt:

<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>

Attribute für die Größe von Widgets

Der Standardstartbildschirm positioniert Widgets in seinem Fenster basierend auf einem Zellenraster mit einer definierten Höhe und Breite. Auf den meisten Startbildschirmen können Widgets nur eine Größe haben, die ein ganzzahliges Vielfaches der Rasterzellen ist, z. B. zwei Zellen horizontal und drei Zellen vertikal.

Mit den Attributen für die Widget-Größe können Sie eine Standardgröße für das Widget angeben und eine Unter- und Obergrenze für die Größe des Widgets festlegen. In diesem Zusammenhang ist die Standardgröße eines Widgets die Größe, die das Widget annimmt, wenn es zum ersten Mal dem Startbildschirm hinzugefügt wird.

In der folgenden Tabelle werden die <appwidget-provider>-Attribute beschrieben, die sich auf die Größe von Widgets beziehen:

Attribute und Beschreibung
targetCellWidth und targetCellHeight (Android 12), minWidth und minHeight
  • Ab Android 12 geben die Attribute targetCellWidth und targetCellHeight die Standardgröße des Widgets in Rasterzellen an. Diese Attribute werden in Android 11 und niedriger ignoriert und können ignoriert werden, wenn der Startbildschirm kein rasterbasiertes Layout unterstützt.
  • Die Attribute minWidth und minHeight geben die Standardgröße des Widgets in dp an. Wenn die Werte für die Mindestbreite oder -höhe eines Widgets nicht mit den Abmessungen der Zellen übereinstimmen, werden die Werte auf die nächste Zellengröße aufgerundet.
Wir empfehlen, beide Attribute anzugeben – targetCellWidth und targetCellHeight sowie minWidth und minHeight –, damit Ihre App auf minWidth und minHeight zurückgreifen kann, wenn das Gerät des Nutzers targetCellWidth und targetCellHeight nicht unterstützt. Wenn die Attribute targetCellWidth und targetCellHeight unterstützt werden, haben sie Vorrang vor den Attributen minWidth und minHeight.
minResizeWidth und minResizeHeight Geben Sie die absolute Mindestgröße des Widgets an. Diese Werte geben die Größe an, unter der das Widget unlesbar oder anderweitig unbrauchbar ist. Mithilfe dieser Attribute kann der Nutzer die Größe des Widgets auf eine kleinere Größe als die Standard-Widgetgröße anpassen. Das Attribut minResizeWidth wird ignoriert, wenn es größer als minWidth ist oder die horizontale Größenänderung nicht aktiviert ist. Weitere Informationen finden Sie unter resizeMode. Ebenso wird das Attribut minResizeHeight ignoriert, wenn es größer als minHeight ist oder die vertikale Größenänderung nicht aktiviert ist.
maxResizeWidth und maxResizeHeight Geben Sie die empfohlene maximale Größe des Widgets an. Wenn die Werte kein Vielfaches der Rasterzellenabmessungen sind, werden sie auf die nächste Zellengröße aufgerundet. Das Attribut maxResizeWidth wird ignoriert, wenn es kleiner als minWidth ist oder die horizontale Größenänderung nicht aktiviert ist. Weitere Informationen finden Sie unter resizeMode. Ebenso wird das Attribut maxResizeHeight ignoriert, wenn es größer als minHeight ist oder die vertikale Größenanpassung nicht aktiviert ist. Einführung in Android 12.
resizeMode Gibt die Regeln an, nach denen die Größe eines Widgets geändert werden kann. Mit diesem Attribut können Sie Startbildschirm-Widgets horizontal, vertikal oder in beide Richtungen skalieren. Nutzer halten ein Widget gedrückt, um die Ziehpunkte für die Größe zu sehen, und ziehen dann die horizontalen oder vertikalen Ziehpunkte, um die Größe im Layout-Raster zu ändern. Zulässige Werte für das Attribut resizeMode sind horizontal, vertical und none. Wenn Sie festlegen möchten, dass die Größe eines Widgets horizontal und vertikal angepasst werden kann, verwenden Sie horizontal|vertical.

Verwendungsbeispiele

Anhand der folgenden Spezifikationen wird veranschaulicht, wie sich die Attribute in der vorherigen Tabelle auf die Größe des Widgets auswirken:

  • Eine Rasterzelle ist 30 dp breit und 50 dp hoch.
  • Die folgende Attributspezifikation wird bereitgestellt:
<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" />

Ab Android 12:

Verwende die Attribute targetCellWidth und targetCellHeight als Standardgröße des Widgets.

Das Widget ist standardmäßig 2 x 2 groß. Die Größe des Widgets kann auf 2 x 1 oder bis zu 4 x 3 verkleinert werden.

Android 11 und niedriger:

Verwenden Sie die Attribute minWidth und minHeight, um die Standardgröße des Widgets zu berechnen.

Die Standardbreite ist Math.ceil(80 / 30) = 3.

Die Standardhöhe ist Math.ceil(80 / 50) = 2.

Das Widget hat standardmäßig eine Größe von 3 × 2. Das Widget kann auf 2 x 1 oder bis zum Vollbildmodus verkleinert werden.

Zusätzliche Widget-Attribute

In der folgenden Tabelle werden die <appwidget-provider>-Attribute beschrieben, die sich auf andere Eigenschaften als die Größe des Widgets beziehen.

Attribute und Beschreibung
updatePeriodMillis Hiermit wird festgelegt, wie oft das Widget-Framework ein Update von der AppWidgetProvider anfordert, indem die onUpdate()-Callback-Methode aufgerufen wird. Bei diesem Wert kann nicht garantiert werden, dass die Aktualisierung genau pünktlich erfolgt. Wir empfehlen, die Aktualisierung möglichst selten und nicht öfter als einmal pro Stunde durchzuführen, um den Akku zu schonen. Eine vollständige Liste der Aspekte, die Sie bei der Auswahl eines geeigneten Aktualisierungszeitraums berücksichtigen sollten, finden Sie unter Optimierungen für die Aktualisierung von Widget-Inhalten.
initialLayout Verweist auf die Layoutressource, die das Widget-Layout definiert.
configure Definiert die Aktivität, die gestartet wird, wenn der Nutzer das Widget hinzufügt, damit er Widget-Eigenschaften konfigurieren kann. Weitere Informationen finden Sie unter Nutzern die Konfiguration von Widgets ermöglichen. Ab Android 12 kann die Erstkonfiguration in deiner App übersprungen werden. Weitere Informationen findest du unter Standardkonfiguration des Widgets verwenden.
description Gibt die Beschreibung an, die in der Widget-Auswahl für Ihr Widget angezeigt werden soll. Einführung in Android 12.
previewLayout (Android 12) und previewImage (Android 11 und niedriger)
  • Ab Android 12 gibt das Attribut previewLayout eine skalierbare Vorschau an, die du als XML-Layout mit der Standardgröße des Widgets zur Verfügung stellst. Idealerweise entspricht die als dieses Attribut angegebene Layout-XML-Datei der Layout-XML-Datei des tatsächlichen Widgets mit realistischen Standardwerten.
  • Unter Android 11 oder niedriger gibt das previewImage-Attribut eine Vorschau des Widgets nach der Konfiguration an, die Nutzer sehen, wenn sie das App-Widget auswählen. Wenn Sie kein Symbol angeben, wird Nutzern stattdessen das Launcher-Symbol Ihrer App angezeigt. Dieses Feld entspricht dem Attribut android:previewImage im Element <receiver> in der AndroidManifest.xml-Datei.
Hinweis:Wir empfehlen, sowohl das previewImage- als auch das previewLayout-Attribut anzugeben, damit Ihre App auf previewImage zurückgreifen kann, wenn das Gerät des Nutzers previewLayout nicht unterstützt. Weitere Informationen findest du unter Abwärtskompatibilität mit skalierbaren Widget-Vorschauen.
autoAdvanceViewId Gibt die Ansichts-ID der Widget-Unteransicht an, die vom Host des Widgets automatisch vor- und zurückgescrollt wird.
widgetCategory Gibt an, ob Ihr Widget auf dem Startbildschirm (home_screen), dem Sperrbildschirm (keyguard) oder auf beiden angezeigt werden kann. Unter Android 5.0 und höher ist nur home_screen gültig.
widgetFeatures Hier werden die vom Widget unterstützten Funktionen deklariert. Wenn dein Widget beispielsweise seine Standardkonfiguration verwenden soll, wenn ein Nutzer es hinzufügt, gib sowohl das Flag configuration_optional als auch das Flag reconfigurable an. Dadurch wird verhindert, dass die Konfigurationsaktivität gestartet wird, nachdem ein Nutzer das Widget hinzugefügt hat. Der Nutzer kann das Widget danach neu konfigurieren.

AppWidgetProvider-Klasse zum Verarbeiten von Widget-Broadcasts verwenden

Die AppWidgetProvider-Klasse verarbeitet Widget-Broadcasts und aktualisiert das Widget als Reaktion auf Widget-Lebenszyklusereignisse. In den folgenden Abschnitten wird beschrieben, wie Sie AppWidgetProvider im Manifest deklarieren und dann implementieren.

Widget im Manifest deklarieren

Deklarieren Sie zuerst die AppWidgetProvider-Klasse in der AndroidManifest.xml-Datei Ihrer App, wie im folgenden Beispiel gezeigt:

<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>

Das Element <receiver> erfordert das Attribut android:name, das die vom Widget verwendete AppWidgetProvider angibt. Die Komponente muss nur exportiert werden, wenn ein separater Prozess an deine AppWidgetProvider übertragen werden muss. Das ist normalerweise nicht der Fall.

Das <intent-filter>-Element muss ein <action>-Element mit dem Attribut android:name enthalten. Dieses Attribut gibt an, dass AppWidgetProvider die Übertragung ACTION_APPWIDGET_UPDATE akzeptiert. Dies ist die einzige Übertragung, die Sie explizit deklarieren müssen. Der AppWidgetManager sendet alle anderen Widget-Broadcasts bei Bedarf automatisch an den AppWidgetProvider.

Das <meta-data>-Element gibt die AppWidgetProviderInfo-Ressource an und erfordert die folgenden Attribute:

  • android:name: Gibt den Metadatennamen an. Verwenden Sie android.appwidget.provider, um die Daten als AppWidgetProviderInfo-Beschreibung zu identifizieren.
  • android:resource: Gibt den Speicherort der AppWidgetProviderInfo-Ressource an.

AppWidgetProvider-Klasse implementieren

Die Klasse AppWidgetProvider erweitert BroadcastReceiver als praktische Klasse zum Verwalten von Widget-Broadcasts. Es empfängt nur die Ereignis-Broadcasts, die für das Widget relevant sind, z. B. wenn das Widget aktualisiert, gelöscht, aktiviert oder deaktiviert wird. Wenn diese Broadcast-Ereignisse auftreten, werden die folgenden AppWidgetProvider-Methoden aufgerufen:

onUpdate()
Diese Funktion wird aufgerufen, um das Widget in Intervallen zu aktualisieren, die durch das Attribut updatePeriodMillis in der AppWidgetProviderInfo definiert sind. Weitere Informationen finden Sie in der Tabelle mit zusätzlichen Widget-Attributen auf dieser Seite.
Diese Methode wird auch aufgerufen, wenn der Nutzer das Widget hinzufügt. Sie führt die grundlegende Einrichtung durch, beispielsweise das Definieren von Event-Handlern für View-Objekte oder das Starten von Jobs zum Laden von Daten, die im Widget angezeigt werden sollen. Wenn du jedoch eine Konfigurationsaktivität ohne das Flag configuration_optional angibst, wird diese Methode nicht aufgerufen, wenn der Nutzer das Widget hinzufügt. Sie wird jedoch für die nachfolgenden Aktualisierungen aufgerufen. Die Konfigurationsaktivität ist dafür verantwortlich, das erste Update auszuführen, sobald die Konfiguration abgeschlossen ist. Weitere Informationen finden Sie unter Nutzer zum Konfigurieren von App-Widgets berechtigen.
Der wichtigste Rückruf ist onUpdate(). Weitere Informationen finden Sie auf dieser Seite unter Ereignisse mit der Klasse onUpdate() verarbeiten.
onAppWidgetOptionsChanged()

Diese Funktion wird aufgerufen, wenn das Widget zum ersten Mal platziert wird und jedes Mal, wenn es neu skaliert wird. Mit diesem Rückruf können Sie Inhalte basierend auf den Größenbereichen des Widgets anzeigen oder ausblenden. Rufen Sie getAppWidgetOptions() auf, um die Größenbereiche und ab Android 12 die Liste der möglichen Größen einer Widget-Instanz abzurufen. Sie erhalten dann eine Bundle mit den folgenden Informationen:

onDeleted(Context, int[])

Diese Funktion wird jedes Mal aufgerufen, wenn ein Widget vom Widget-Host gelöscht wird.

onEnabled(Context)

Diese Funktion wird aufgerufen, wenn eine Instanz des Widgets zum ersten Mal erstellt wird. Wenn der Nutzer beispielsweise zwei Instanzen Ihres Widgets hinzufügt, wird dieser Code nur beim ersten Mal aufgerufen. Wenn Sie eine neue Datenbank öffnen oder eine andere Einrichtung vornehmen müssen, die nur einmal für alle Widget-Instanzen erfolgen muss, ist dies der richtige Ort.

onDisabled(Context)

Diese Funktion wird aufgerufen, wenn die letzte Instanz Ihres Widgets vom Widget-Host gelöscht wird. Hier können Sie alle in onEnabled(Context) ausgeführten Arbeiten bereinigen, z. B. eine temporäre Datenbank löschen.

onReceive(Context, Intent)

Diese Methode wird für jede Übertragung und vor jeder der vorherigen Callback-Methoden aufgerufen. Normalerweise müssen Sie diese Methode nicht implementieren, da die Standardimplementierung von AppWidgetProvider alle Widget-Broadcasts filtert und die vorherigen Methoden entsprechend aufruft.

Sie müssen Ihre AppWidgetProvider-Klassenimplementierung mithilfe des <receiver>-Elements in der AndroidManifest als Broadcastempfänger deklarieren. Weitere Informationen finden Sie auf dieser Seite unter Widget im Manifest deklarieren.

Ereignisse mit der Klasse „onUpdate()“ verarbeiten

Der wichtigste AppWidgetProvider-Callback ist onUpdate(), da er aufgerufen wird, wenn jedem Widget ein Host hinzugefügt wird, es sei denn, Sie verwenden eine Konfigurationsaktivität ohne das Flag configuration_optional. Wenn Ihr Widget Nutzerinteraktionsereignisse akzeptiert, registrieren Sie die Event-Handler in diesem Rückruf. Wenn mit Ihrem Widget keine temporären Dateien oder Datenbanken erstellt werden oder andere Aufgaben ausgeführt werden, die eine Bereinigung erfordern, ist onUpdate() möglicherweise die einzige Callback-Methode, die Sie definieren müssen.

Wenn Sie beispielsweise ein Widget mit einer Schaltfläche benötigen, die eine Aktivität startet, wenn darauf getippt wird, können Sie die folgende Implementierung von AppWidgetProvider verwenden:

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);
        }
    }
}

In diesem AppWidgetProvider wird nur die onUpdate()-Methode definiert, um ein PendingIntent zu erstellen, das ein Activity startet und mit setOnClickPendingIntent(int, PendingIntent) an die Schaltfläche des Widgets anhängt. Es enthält eine Schleife, die jeden Eintrag in appWidgetIds durchläuft. appWidgetIds ist ein Array von IDs, die jedes von diesem Anbieter erstellte Widget identifizieren. Wenn der Nutzer mehrere Instanzen des Widgets erstellt, werden sie gleichzeitig aktualisiert. Es wird jedoch nur ein updatePeriodMillis-Zeitplan für alle Instanzen des Widgets verwaltet. Wenn beispielsweise das Aktualisierungsintervall alle zwei Stunden festgelegt ist und eine zweite Instanz des Widgets eine Stunde nach der ersten hinzugefügt wird, werden beide Widgets im durch die erste Instanz definierten Zeitraum aktualisiert. Der zweite Aktualisierungszeitraum wird ignoriert. Beide werden alle zwei Stunden, nicht stündlich aktualisiert.

Weitere Informationen finden Sie in der Beispielklasse ExampleAppWidgetProvider.java.

Widget-Übertragungs-Intents empfangen

AppWidgetProvider ist eine praktische Klasse. Wenn du die Widget-Broadcasts direkt erhalten möchtest, kannst du deine eigene BroadcastReceiver implementieren oder den onReceive(Context,Intent)-Callback überschreiben. Die folgenden Intents sind wichtig:

Widget-Layout erstellen

Sie müssen ein anfängliches Layout für Ihr Widget in XML definieren und es im Verzeichnis res/layout/ des Projekts speichern. Weitere Informationen finden Sie in den Designrichtlinien.

Das Erstellen des Widget-Layouts ist ganz einfach, wenn Sie mit Layouts vertraut sind. Beachten Sie jedoch, dass Widget-Layouts auf RemoteViews basieren, das nicht alle Layout- oder Ansichts-Widgets unterstützt. Sie können keine benutzerdefinierten Ansichten oder Unterklassen der von RemoteViews unterstützten Ansichten verwenden.

RemoteViews unterstützt auch ViewStub, eine unsichtbare View mit einer Größe von null, mit der Sie Layoutressourcen bei der Laufzeit träge maximieren können.

Unterstützung für zustandsorientiertes Verhalten

Android 12 unterstützt zustandsabhängiges Verhalten mit den folgenden vorhandenen Komponenten:

Das Widget ist weiterhin zustandslos. Ihre App muss den Status speichern und sich für Statusänderungsereignisse registrieren.

Beispiel für ein Einkaufslisten-Widget mit zustandsorientiertem Verhalten
Abbildung 3: Beispiel für zustandsorientiertes Verhalten.

Im folgenden Codebeispiel wird gezeigt, wie Sie diese Komponenten implementieren.

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));

Stellen Sie zwei Layouts bereit: eines für Geräte mit Android 12 oder höher in res/layout-v31 und eines für ältere Android-Versionen (Android 11 oder niedriger) im Standardordner res/layout.

Abgerundete Ecken implementieren

In Android 12 gibt es die folgenden Systemparameter, mit denen Sie den Radius der abgerundeten Ecken Ihres Widgets festlegen können:

Das folgende Beispiel zeigt ein Widget, in dem system_app_widget_background_radius für die Ecke des Widgets und system_app_widget_inner_radius für Ansichten innerhalb des Widgets verwendet wird.

Widget mit Radien des Widget-Hintergrunds und der Ansichten im Widget
Abbildung 4: Abgerundete Ecken.

1 Ecke des Widgets.

2 Ecke einer Ansicht im Widget.

Wichtige Hinweise zu abgerundeten Ecken

  • Launcher von Drittanbietern und Gerätehersteller können den Parameter system_app_widget_background_radius überschreiben, sodass er kleiner als 28 dp ist. Der Parameter system_app_widget_inner_radius ist immer 8 dp kleiner als der Wert von system_app_widget_background_radius.
  • Wenn für Ihr Widget kein @android:id/background verwendet wird oder Sie keinen Hintergrund definieren, der den Inhalt basierend auf dem Umriss zuschneidet, und android:clipToOutline auf true festgelegt ist, erkennt der Launcher automatisch den Hintergrund und schneidet das Widget mit einem Rechteck mit abgerundeten Ecken von bis zu 16 dp zu. Weitere Informationen finden Sie unter Achten Sie darauf, dass Ihr Widget mit Android 12 kompatibel ist.

Für die Widget-Kompatibilität mit früheren Android-Versionen empfehlen wir, benutzerdefinierte Attribute zu definieren und sie mit einem benutzerdefinierten Design für Android 12 zu überschreiben, wie in den folgenden Beispiel-XML-Dateien gezeigt:

/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" />