Tworzenie widżetu aplikacji za pomocą aplikacji Glance

W następnych sekcjach dowiesz się, jak utworzyć prosty widżet aplikacji za pomocą Glance.

Zadeklaruj AppWidget w pliku manifestu

Po wykonaniu czynności konfiguracyjnych zadeklaruj w swojej aplikacji usługę AppWidget i jej metadane.

  1. Odsuń odbiornik AppWidget od urządzenia GlanceAppWidgetReceiver:

    class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {     override val glanceAppWidget: GlanceAppWidget = TODO("Create GlanceAppWidget") }

  2. Zarejestruj dostawcę widżetu aplikacji w pliku AndroidManifest.xml i powiązanym pliku metadanych:

        <receiver android:name=".glance.MyReceiver"     android:exported="true">     <intent-filter>         <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />     </intent-filter>     <meta-data         android:name="android.appwidget.provider"         android:resource="@xml/my_app_widget_info" /> </receiver> 

Dodaj metadane AppWidgetProviderInfo

Następnie postępuj zgodnie z instrukcjami w przewodniku tworzenia prostego widżetu, aby utworzyć i zdefiniować informacje o widżecie aplikacji w pliku @xml/my_app_widget_info.

Jedyną różnicą w przypadku Glance jest to, że nie ma pliku XML initialLayout, ale musisz go zdefiniować. Możesz użyć wstępnie zdefiniowanego układu wczytywania dostępnego w bibliotece:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"     android:initialLayout="@layout/glance_default_loading_layout"> </appwidget-provider> 

Zdefiniuj GlanceAppWidget

  1. Utwórz nową klasę, która rozszerza klasę GlanceAppWidget i zastępuje metodę provideGlance. Ta metoda umożliwia wczytywanie danych potrzebnych do renderowania widżetu:

    class MyAppWidget : GlanceAppWidget() {      override suspend fun provideGlance(context: Context, id: GlanceId) {          // In this method, load data needed to render the AppWidget.         // Use `withContext` to switch to another thread for long running         // operations.          provideContent {             // create your AppWidget here             Text("Hello World")         }     } }

  2. Utwórz instancję w glanceAppWidget na urządzeniu GlanceAppWidgetReceiver:

    class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {      // Let MyAppWidgetReceiver know which GlanceAppWidget to use     override val glanceAppWidget: GlanceAppWidget = MyAppWidget() }

Użytkownik skonfigurował AppWidget za pomocą Glance.

Tworzenie interfejsu użytkownika

Ten fragment kodu pokazuje, jak utworzyć interfejs użytkownika:

/* Import Glance Composables  In the event there is a name clash with the Compose classes of the same name,  you may rename the imports per https://kotlinlang.org/docs/packages.html#imports  using the `as` keyword.  import androidx.glance.Button import androidx.glance.layout.Column import androidx.glance.layout.Row import androidx.glance.text.Text */ class MyAppWidget : GlanceAppWidget() {      override suspend fun provideGlance(context: Context, id: GlanceId) {         // Load data needed to render the AppWidget.         // Use `withContext` to switch to another thread for long running         // operations.          provideContent {             // create your AppWidget here             MyContent()         }     }      @Composable     private fun MyContent() {         Column(             modifier = GlanceModifier.fillMaxSize(),             verticalAlignment = Alignment.Top,             horizontalAlignment = Alignment.CenterHorizontally         ) {             Text(text = "Where to?", modifier = GlanceModifier.padding(12.dp))             Row(horizontalAlignment = Alignment.CenterHorizontally) {                 Button(                     text = "Home",                     onClick = actionStartActivity<MyActivity>()                 )                 Button(                     text = "Work",                     onClick = actionStartActivity<MyActivity>()                 )             }         }     } }

Poprzedni przykładowy kod wykonuje te czynności:

  • Na najwyższym poziomie Column elementy są ułożone pionowo jeden po drugim.
  • Element Column rozszerza swój rozmiar, aby dopasować go do dostępnej przestrzeni (za pomocą GlanceModifier), a jego zawartość jest wyrównana do góry (verticalAlignment) i wyśrodkowana poziomo (horizontalAlignment).
  • Treść funkcji Column jest definiowana za pomocą funkcji lambda. Kolejność ma znaczenie.
    • Pierwszym elementem w Column jest komponent Text12.dp mm wypełniacza.
    • Drugi element to Row, w którym elementy są umieszczane jeden pod drugim w poziomie, a dwa elementy Buttons są wyśrodkowane poziomo (horizontalAlignment). Ostateczne wyświetlenie zależy od dostępnej przestrzeni. Poniżej znajdziesz przykład tego, jak może wyglądać:
destination_widget
Rysunek 1. Przykładowy interfejs użytkownika.

Aby zmienić umiejscowienie i rozmiar komponentów, możesz zmienić wartości wyrównania lub zastosować inne wartości modyfikatorów (np. padding). Pełną listę komponentów, parametrów i dostępnych modyfikatorów dla każdej klasy znajdziesz w dokumentacji.