Widget optimieren

Jetpack Compose ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Informationen zum Erstellen von Widgets mit Compose-APIs

Auf dieser Seite finden Sie Details zu optionalen Widget-Verbesserungen, die ab Android 12 (API-Level 31) verfügbar sind. Diese Funktionen sind optional, lassen sich aber einfach implementieren und verbessern die Widget-Nutzung für Ihre Nutzer.

Dynamische Farben verwenden

Ab Android 12 kann ein Widget die Farben des Gerätedesigns für Schaltflächen, Hintergründe und andere Komponenten verwenden. Das sorgt für reibungslosere Übergänge und Konsistenz zwischen verschiedenen Widgets.

Es gibt zwei Möglichkeiten, dynamische Farben zu verwenden:

Sobald das Design im Root-Layout festgelegt ist, können Sie allgemeine Farbattribute im Root-Layout oder in einem seiner untergeordneten Elemente verwenden, um die dynamischen Farben zu übernehmen.

Einige Beispiele für Farbattribute, die Sie verwenden können, sind:

  • ?attr/primary
  • ?attr/primaryContainer
  • ?attr/onPrimary
  • ?attr/onPrimaryContainer

Im folgenden Beispiel mit dem Material 3-Design ist die Designfarbe des Geräts „lila“. Die Akzentfarbe und der Widget-Hintergrund passen sich an den hellen und dunklen Modus an, wie in Abbildung 1 und 2 zu sehen.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="?attr/colorPrimaryContainer"
  android:theme="@style/Theme.Material3.DynamicColors.DayNight">

  <ImageView
    ...
    app:tint="?attr/colorPrimaryContainer"
    android:src="@drawable/ic_partly_cloudy" />

    <!-- Other widget content. -->

</LinearLayout>
Widget im hellen Design
Abbildung 1. Widget im hellen Design
Widgets im dunklen Design
Abbildung 2. Widget im dunklen Design

Abwärtskompatibilität für dynamische Farben

Dynamische Farben sind nur auf Geräten mit Android 12 oder höher verfügbar. Wenn Sie ein benutzerdefiniertes Design für niedrigere Versionen bereitstellen möchten, erstellen Sie ein Standarddesign mit Ihren benutzerdefinierten Farben und einem neuen Qualifier (values-v31) mit den Standarddesignattributen.

Hier ein Beispiel mit dem Material 3-Design:

/values/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
    <!-- Override default colorBackground attribute with custom color. -->
    <item name="android:colorBackground">@color/my_background_color</item>

    <!-- Add other colors/attributes. -->

  </style>
</resources>

/values-v31/styles.xml

<resources>
  <!-- Do not override any color attribute. -->
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>

/layout/my_widget_layout.xml

<resources>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:background="?android:attr/colorBackground"
    android:theme="@style/MyWidgetTheme" />
</resources>

Sprachunterstützung aktivieren

App-Aktionen lassen Google Assistant Widgets als Reaktion auf relevante Sprachbefehle von Nutzern anzeigen. Wenn Sie Ihr Widget so konfigurieren, dass es auf integrierte Intents (Built-in Intents, BIIs) reagiert, kann Ihre App Widgets proaktiv auf Assistant-Oberflächen wie Android und Android Auto anzeigen. Nutzer haben die Möglichkeit, von Assistant angezeigte Widgets an ihren Launcher anzupinnen, um die zukünftige Interaktion zu fördern.

Sie können beispielsweise das Widget für die Trainingszusammenfassung für Ihre Trainings-App so konfigurieren, dass es die Sprachbefehle des Nutzers ausführt, die den GET_EXERCISE_OBSERVATION BII auslösen. Assistant zeigt Ihr Widget proaktiv an, wenn Nutzer diesen BII auslösen, indem sie Anfragen wie „Hey Google, wie viele Kilometer bin ich diese Woche mit Beispiel-App gelaufen?“ stellen.

Es gibt Dutzende von BIIs, die mehrere Kategorien der Nutzerinteraktion abdecken. So können fast alle Android-Apps ihre Widgets für die Sprachsteuerung optimieren. Informationen zum Einstieg finden Sie unter App-Aktionen in Android-Widgets einbinden.

Widget einen Namen geben

Widgets müssen einen eindeutigen Namen haben, wenn sie in der Widget-Auswahl angezeigt werden.

Die Namen der Widgets werden aus dem Attribut label des receiver-Elements des Widgets in der Datei AndroidManifest.xml geladen.

<receiver
    ….
   android:label="Memories">
     ….
</receiver>

Widget eine Beschreibung hinzufügen

Ab Android 12 können Sie eine Beschreibung für die Widget-Auswahl angeben, die für Ihr Widget angezeigt werden soll.

Ein Bild mit einer Widget-Auswahl, in der ein Widget und seine Beschreibung angezeigt werden
Abbildung 3 Beispiel für eine Widget-Auswahl mit einem Widget und seiner Beschreibung

Geben Sie eine Beschreibung für Ihr Widget mit dem description Attribut des &lt;appwidget-provider&gt; Elements an:

<appwidget-provider
    android:description="@string/my_widget_description">
</appwidget-provider>

Sie können das descriptionRes Attribut in früheren Android-Versionen verwenden, es wird aber von der Widget Auswahl ignoriert.

Reibungslosere Übergänge ermöglichen

Ab Android 12 bieten Launcher einen reibungsloseren Übergang, wenn ein Nutzer Ihre App über ein Widget startet.

Um diesen verbesserten Übergang zu aktivieren, verwenden Sie @android:id/background oder android.R.id.background, um das Hintergrundelement zu identifizieren:

// Top-level layout of the widget.
<LinearLayout
    android:id="@android:id/background">
</LinearLayout>

Ihre App kann @android:id/background in früheren Android-Versionen verwenden, ohne dass es zu Problemen kommt. Es wird jedoch ignoriert.

RemoteViews zur Laufzeit ändern

Ab Android 12 können Sie mehrere RemoteViews-Methoden nutzen, mit denen Sie RemoteViews-Attribute zur Laufzeit ändern können. Die vollständige Liste der hinzugefügten Methoden finden Sie in der RemoteViews API -Referenz.

Das folgende Codebeispiel zeigt, wie einige dieser Methoden verwendet werden.

Kotlin

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList())

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP)

Java

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList());

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP);