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](https://developer.android.google.cn/static/images/appwidgets/music.png?authuser=6&hl=de)
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](https://developer.android.google.cn/static/images/appwidgets/flow-diagram.png?authuser=6&hl=de)
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.
- Ab Android 12 (API-Level 31) kannst du eine Standardkonfiguration angeben und es Nutzern ermöglichen, das Widget später neu zu konfigurieren. Weitere Informationen finden Sie unter Standardkonfiguration des Widgets verwenden und Neukonfiguration von platzierten Widgets durch Nutzer aktivieren.
- Unter Android 11 (API-Level 30) oder niedriger wird diese Aktivität jedes Mal gestartet, wenn der Nutzer das Widget dem Startbildschirm hinzufügt.
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 |
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) |
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 Sieandroid.appwidget.provider
, um die Daten alsAppWidgetProviderInfo
-Deskriptor zu identifizieren.android:resource
: gibt den RessourcenstandortAppWidgetProviderInfo
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
inAppWidgetProviderInfo
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 Flagconfiguration_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 KlasseonUpdate()
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 einBundle
zurückgegeben, das Folgendes enthält:OPTION_APPWIDGET_MIN_WIDTH
: enthält die Untergrenze für die Breite einer Widget-Instanz in dp-Einheiten.OPTION_APPWIDGET_MIN_HEIGHT
: enthält die Untergrenze für die Höhe einer Widget-Instanz in dp-Einheiten.OPTION_APPWIDGET_MAX_WIDTH
: enthält die Obergrenze für die Breite einer Widgetinstanz in dp-Einheiten.OPTION_APPWIDGET_MAX_HEIGHT
: enthält die Obergrenze für die Höhe einer Widgetinstanz in dp-Einheiten.OPTION_APPWIDGET_SIZES
: enthält die Liste der möglichen Größen (List<SizeF>
) in dp-Einheiten, die eine Widget-Instanz annehmen kann. Mit Android 12 eingeführt.
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:
ACTION_APPWIDGET_UPDATE
ACTION_APPWIDGET_DELETED
ACTION_APPWIDGET_ENABLED
ACTION_APPWIDGET_DISABLED
ACTION_APPWIDGET_OPTIONS_CHANGED
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](https://developer.android.google.cn/static/images/appwidgets/home.png?authuser=6&hl=de)
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:
system_app_widget_background_radius
: der Eckenradius des Widget-Hintergrunds, der nie größer als 28 dp istsystem_app_widget_inner_radius
: der Eckenradius einer beliebigen Ansicht im Widget Dies ist genau 8 dp weniger als der Hintergrundradius, um bei einem Abstand von 8 dp eine gute Ausrichtung zu ermöglichen.
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](https://developer.android.google.cn/static/images/appwidgets/widget-weather.png?authuser=6&hl=de)
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 Parametersystem_app_widget_inner_radius
ist immer 8 dp kleiner als der Wert vonsystem_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 undandroid:clipToOutline
auftrue
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" />