Einfaches Widget erstellen

App-Widgets sind kleine App-Ansichten, die Sie in andere Apps einbetten können, z. B. den Startbildschirm. Sie erhalten regelmäßig Updates. Diese Ansichten werden in der Benutzeroberfläche als Widgets bezeichnet. Du kannst sie mit einem App-Widget-Anbieter (oder 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 Widgethost erstellen.

Informationen zum Design Ihres Widgets finden Sie unter App-Widgets – Übersicht.

Widget-Komponenten

Zum Erstellen eines Widgets benötigen Sie die folgenden Grundkomponenten:

Objekt AppWidgetProviderInfo
Beschreibt die Metadaten für ein Widget, z. B. das Layout des Widgets, die Aktualisierungshäufigkeit und die Klasse AppWidgetProvider. AppWidgetProviderInfo ist in XML definiert, wie in diesem Dokument beschrieben.
AppWidgetProvider Kurs
Definiert die grundlegenden Methoden, die Ihnen eine programmatische Schnittstelle mit dem Widget ermöglichen. Über ihn erhalten Sie Broadcasts, wenn das Widget aktualisiert, aktiviert, deaktiviert oder gelöscht wird. Du deklarierst AppWidgetProvider im Manifest und implementierst es dann, wie in diesem Dokument beschrieben.
Layout ansehen
Definiert das anfä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: Verarbeitungsablauf des App-Widgets.

Wenn für Ihr Widget eine Nutzerkonfiguration erforderlich ist, implementieren Sie die Konfigurationsaktivität für das App-Widget. Mit 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 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 Ordner res/xml/ 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>

Größenattribute für das Widget

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 Größen annehmen, die ein ganzzahliges Vielfaches der Rasterzellen sind, z. B. zwei Zellen horizontal und drei Zellen vertikal.

Mit den Widget-Größenattributen kannst du eine Standardgröße für dein Widget festlegen und Unter- und Obergrenzen für die Widgetgröße 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 für die Widget-Größe beschrieben:

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 Bezug auf 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 Gruppen von Attributen anzugeben – targetCellWidth und targetCellHeight sowie minWidth und minHeight – damit deine 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 unleserlich 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ößenanpassung 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ößenanpassung 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ößenanpassung 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. Mit Android 12 eingeführt.
resizeMode Gibt die Regeln an, nach denen die Größe eines Widgets geändert werden kann. Mit diesem Attribut können Sie dafür sorgen, dass die Größe von Startbildschirm-Widgets horizontal, vertikal oder auf beiden Achsen angepasst werden kann. Nutzer berühren und halten ein Widget, um die Ziehpunkte zum Anpassen der Größe einzublenden. Ziehen Sie dann die horizontalen oder vertikalen Ziehpunkte, um die Größe im Layoutraster zu ändern. Zu den Werten für das Attribut resizeMode gehören 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.

Beispiel

Um zu veranschaulichen, wie sich die Attribute in der vorherigen Tabelle auf die Widget-Größe auswirken, gehen wir von den folgenden Spezifikationen aus:

  • Eine Zelle im Raster 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:

Verwende 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 ist standardmäßig 3 x 2 groß. 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 für andere Qualitäten als die Widget-Größe beschrieben.

Attribute und Beschreibung
updatePeriodMillis Legt fest, wie oft das Widget-Framework durch Aufrufen der Callback-Methode onUpdate() eine Aktualisierung von AppWidgetProvider anfordert. 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 Überlegungen zur Auswahl eines geeigneten Aktualisierungszeitraums findest du 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 erlauben, Widgets zu konfigurieren. Ab Android 12 kann die Erstkonfiguration in deiner App übersprungen werden. Weitere Informationen findest du unter Standardkonfiguration des Widgets verwenden.
description Gibt die Beschreibung für die Widget-Auswahl an, die für Ihr Widget angezeigt werden soll. Mit Android 12 eingeführt.
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 Attribut previewImage eine Vorschau des Widgets nach seiner Konfiguration an, die der Nutzer sieht, wenn er das App-Widget auswählt. Falls nicht angegeben, sieht der Nutzer stattdessen das Launcher-Symbol deiner App. Dieses Feld entspricht dem Attribut android:previewImage im Element <receiver> in der Datei AndroidManifest.xml.
Hinweis:Wir empfehlen, sowohl das Attribut previewImage als auch das Attribut previewLayout anzugeben, damit deine App previewImage verwenden 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 erweitert wird.
widgetCategory Gibt an, ob dein Widget auf dem Startbildschirm (home_screen), auf dem Sperrbildschirm (keyguard) oder in beiden angezeigt werden kann. Ab Android 5.0 ist nur home_screen gültig.
widgetFeatures Deklariert vom Widget unterstützte Funktionen. 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 die Konfigurationsaktivität nicht gestartet, nachdem ein Nutzer das Widget hinzugefügt hat. Der Nutzer kann das Widget später immer noch neu konfigurieren.

Widget-Broadcasts mithilfe der AppWidgetProvider-Klasse verarbeiten

Die Klasse AppWidgetProvider verarbeitet Widget-Broadcasts und aktualisiert das Widget als Reaktion auf Lebenszyklusereignisse von Widgets. In den folgenden Abschnitten wird beschrieben, wie AppWidgetProvider im Manifest deklariert und anschließend implementiert wird.

Widget im Manifest deklarieren

Deklariere zuerst die Klasse AppWidgetProvider in der Datei AndroidManifest.xml deiner Anwendung, 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>

Für das Element <receiver> ist das Attribut android:name erforderlich, das den vom Widget verwendeten AppWidgetProvider angibt. Die Komponente darf nicht exportiert werden, es sei denn, ein separater Prozess muss eine Nachricht an Ihre AppWidgetProvider senden. Dies ist in der Regel nicht der Fall.

Das Element <intent-filter> 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 du explizit deklarieren musst. AppWidgetManager sendet bei Bedarf automatisch alle anderen Widget-Broadcasts an AppWidgetProvider.

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

  • android:name: gibt den Metadatennamen an. Verwenden Sie android.appwidget.provider, um die Daten als AppWidgetProviderInfo-Deskriptor zu identifizieren.
  • android:resource: gibt den Ressourcenstandort AppWidgetProviderInfo an.

AppWidgetProvider-Klasse implementieren

Die Klasse AppWidgetProvider erweitert BroadcastReceiver als Convenience-Klasse zur Verarbeitung von Widget-Broadcasts. Es empfängt nur die Ereignisübertragungen, 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()
Wird aufgerufen, um das Widget in Intervallen zu aktualisieren, die durch das Attribut updatePeriodMillis in AppWidgetProviderInfo definiert sind. Weitere Informationen finden Sie auf dieser Seite in der Tabelle mit weiteren Widget-Attributen.
Diese Methode wird auch aufgerufen, wenn der Nutzer das Widget hinzufügt. Sie führt die grundlegende Einrichtung aus, z. B. 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 erste Aktualisierung nach Abschluss der Konfiguration erfolgt durch die Konfigurationsaktivität. Weitere Informationen finden Sie unter Nutzern erlauben, App-Widgets zu konfigurieren.
Der wichtigste Callback ist onUpdate(). Weitere Informationen finden Sie auf dieser Seite unter Ereignisse mit der Klasse onUpdate() verarbeiten.
onAppWidgetOptionsChanged()

Sie wird aufgerufen, wenn das Widget zum ersten Mal platziert wird und wenn die Größe des Widgets geändert wird. Mit diesem Callback können Sie Inhalte basierend auf den Größenbereichen des Widgets ein- oder ausblenden. Rufen Sie die Größenbereiche und ab Android 12 die Liste der möglichen Größen ab, die eine Widget-Instanz annehmen kann. Rufen Sie dazu getAppWidgetOptions() auf. Daraufhin wird ein Bundle zurückgegeben, das Folgendes enthält:

onDeleted(Context, int[])

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

onEnabled(Context)

Dieses wird aufgerufen, wenn eine Instanz des Widgets zum ersten Mal erstellt wird. Wenn der Nutzer beispielsweise zwei Instanzen Ihres Widgets hinzufügt, wird dies nur beim ersten Mal aufgerufen. Wenn Sie eine neue Datenbank öffnen oder eine andere Einrichtung vornehmen müssen, die für alle Widgetinstanzen nur einmal erforderlich ist, ist dies eine gute Möglichkeit.

onDisabled(Context)

Dieser wird aufgerufen, wenn die letzte Instanz des Widgets vom Widget-Host gelöscht wird. Hier bereinigen Sie alle in onEnabled(Context) durchgeführten Aufgaben, z. B. das Löschen einer temporären Datenbank.

onReceive(Context, Intent)

Dies wird bei jeder Übertragung und vor jeder der vorherigen Callback-Methoden aufgerufen. Normalerweise musst du diese Methode nicht implementieren, da die Standardimplementierung AppWidgetProvider alle Widget-Broadcasts filtert und die vorherigen Methoden entsprechend aufruft.

Du musst die Klassenimplementierung AppWidgetProvider mit dem Element <receiver> im AndroidManifest als Broadcast-Empfänger deklarieren. Weitere Informationen findest du auf dieser Seite unter Widget im Manifest deklarieren.

Ereignisse mit der onUpdate()-Klasse verarbeiten

Der wichtigste AppWidgetProvider-Callback ist onUpdate(), da er aufgerufen wird, wenn jedes Widget einem Host hinzugefügt wird, es sei denn, Sie verwenden eine Konfigurationsaktivität ohne das Flag configuration_optional. Wenn dein Widget Nutzerinteraktionsereignisse akzeptiert, registriere die Event-Handler in diesem Callback. Wenn mit Ihrem Widget keine temporären Dateien oder Datenbanken erstellt werden oder andere Arbeiten 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 beim Tippen eine Aktivität startet, 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);
        }
    }
}

Dieses AppWidgetProvider definiert nur die onUpdate()-Methode. Damit wird eine PendingIntent erstellt, die ein Activity startet und mithilfe von setOnClickPendingIntent(int, PendingIntent) an die Schaltfläche des Widgets anhängt. Er enthält eine Schleife, die jeden Eintrag in appWidgetIds durchläuft. Dabei handelt es sich um ein Array von IDs, die jedes von diesem Anbieter erstellte Widget identifizieren. Wenn der Nutzer mehr als eine Instanz des Widgets erstellt, werden alle gleichzeitig aktualisiert. Für alle Instanzen des Widgets wird jedoch nur ein updatePeriodMillis-Zeitplan verwaltet. Wenn für den Aktualisierungszeitplan beispielsweise eine Dauer von zwei Stunden festgelegt ist und eine zweite Instanz des Widgets eine Stunde nach der ersten hinzugefügt wird, werden beide gemäß dem vom ersten festgelegten Zeitraum aktualisiert. Der zweite Aktualisierungszeitraum wird ignoriert. Sie werden alle zwei Stunden aktualisiert, nicht stündlich.

Weitere Informationen finden Sie in der Beispielklasse ExampleAppWidgetProvider.java.

Widget-Übertragungs-Intents empfangen

AppWidgetProvider ist eine Convenience-Klasse. Wenn du die Widget-Übertragungen direkt empfangen möchtest, kannst du deine eigene BroadcastReceiver implementieren oder den Callback onReceive(Context,Intent) überschreiben. Sie müssen folgende Intents berücksichtigen:

Widget-Layout erstellen

Du musst ein anfängliches Layout für dein Widget in XML definieren und im Projektverzeichnis res/layout/ speichern. Weitere Informationen finden Sie in den Designrichtlinien.

Das Erstellen des Widget-Layouts ist ganz einfach, wenn Sie mit Layouts vertraut sind. Widget-Layouts basieren jedoch auf RemoteViews, wodurch nicht alle Arten von Layout- oder Ansichts-Widgets unterstützt werden. Sie können keine benutzerdefinierten Ansichten oder abgeleitete Klassen der Ansichten verwenden, die von RemoteViews unterstützt werden.

RemoteViews unterstützt auch ViewStub, ein unsichtbares View-Element mit Nullgröße, mit dem Sie Layoutressourcen zur Laufzeit verzögert aufblähen können.

Unterstützung für zustandsorientiertes Verhalten

Android 12 unterstützt mithilfe der folgenden vorhandenen Komponenten zustandsorientiertes Verhalten:

Das Widget ist immer noch zustandslos. Deine App muss den Status speichern und für Statusänderungsereignisse registrieren.

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

Das folgende Codebeispiel zeigt, wie diese Komponenten implementiert werden.

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

Geben Sie zwei Layouts an: eines für Geräte mit Android 12 oder höher in res/layout-v31 und das andere für die vorherige Version 11 oder niedriger im Standardordner res/layout.

Abgerundete Ecken implementieren

In Android 12 werden die folgenden Systemparameter eingeführt, um die Radien der abgerundeten Ecken Ihres Widgets festzulegen:

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

Widget, das die Radien des Widget-Hintergrunds und die Ansichten im Widget zeigt
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 system_app_widget_background_radius-Parameter so überschreiben, dass 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 in deinem Widget weder @android:id/background verwendet noch ein Hintergrund definiert wird, der den Inhalt basierend auf dem Umriss zuschneidet und android:clipToOutline auf true gesetzt ist, erkennt der Launcher den Hintergrund automatisch und schneidet das Widget mithilfe eines Rechtecks mit bis zu 16 dp abgerundeten Ecken ab. Weitere Informationen findest du unter Prüfen, ob das 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 für Android 12 durch ein benutzerdefiniertes Design 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" />