Widżety aplikacji można konfigurować. Na przykład widżet zegara może umożliwiać użytkownikom skonfigurowanie strefy czasowej, która ma być wyświetlana.
Jeśli chcesz umożliwić użytkownikom konfigurowanie ustawień widżetu, utwórz widżet
konfiguracji Activity. Ta aktywność jest
automatycznie uruchamiana przez hosta widżetu aplikacji, gdy widżet jest tworzony
lub później, w zależności od określonych opcji konfiguracji you
specify.
Deklarowanie aktywności konfiguracji
Zadeklaruj aktywność konfiguracji jako zwykłą aktywność w pliku manifestu Androida. Host widżetu aplikacji uruchamia ją za pomocą działania
ACTION_APPWIDGET_CONFIGURE, więc aktywność musi akceptować ten intencję. Na przykład:
<activity android:name=".ExampleAppWidgetConfigurationActivity">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
Zadeklaruj aktywność w pliku AppWidgetProviderInfo.xml za pomocą atrybutu android:configure. Więcej informacji o
deklarowaniu tego pliku. Oto przykład deklarowania aktywności konfiguracji:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
... >
</appwidget-provider>
Aktywność jest deklarowana z pełną i jednoznaczną przestrzenią nazw, ponieważ program uruchamiający odwołuje się do niej spoza zakresu pakietu.
To wszystko, czego potrzebujesz, aby rozpocząć aktywność konfiguracji. Następnie musisz zaimplementować rzeczywistą aktywność.
Implementowanie aktywności konfiguracji
Podczas implementowania aktywności należy pamiętać o 2 ważnych kwestiach:
- Host widżetu aplikacji wywołuje aktywność konfiguracji, która zawsze musi zwracać wynik. Wynik musi zawierać identyfikator widżetu aplikacji
przekazany przez intencję, która uruchomiła aktywność – zapisany w dodatkach do intencji
jako
EXTRA_APPWIDGET_ID. - Gdy uruchamiana jest aktywność konfiguracji, system nie wysyła transmisji
ACTION_APPWIDGET_UPDATE, co oznacza, że podczas tworzenia widżetu nie wywołuje metodyonUpdate(). Aktywność konfiguracji jest odpowiedzialna za wysłanie żądania aktualizacji doAppWidgetManagerpodczas pierwszego tworzenia widżetu. Jednak w przypadku kolejnych aktualizacji wywoływana jest metodaonUpdate()– jest ona pomijana tylko za pierwszym razem.
Przykłady zwracania wyniku z konfiguracji i aktualizowania widżetu znajdziesz we fragmentach kodu w następnej sekcji.
Aktualizowanie widżetu z poziomu aktywności konfiguracji
Gdy widżet korzysta z aktywności konfiguracji, to ona jest odpowiedzialna za aktualizowanie widżetu po zakończeniu konfiguracji. Możesz to zrobić
wysyłając żądanie aktualizacji bezpośrednio do
AppWidgetManager.
Oto podsumowanie procedury prawidłowego zaktualizowania widżetu i zamknięcia aktywności konfiguracji:
Pobierz identyfikator widżetu aplikacji z intencji, która uruchomiła aktywność:
Kotlin
val appWidgetId = intent?.extras?.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID ) ?: AppWidgetManager.INVALID_APPWIDGET_ID
Java
Intent intent = getIntent(); Bundle extras = intent.getExtras(); int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; if (extras != null) { appWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); }
Ustaw wynik aktywności na
RESULT_CANCELED.Dzięki temu, jeśli użytkownik wyjdzie z aktywności przed jej zakończeniem, system powiadomi hosta widżetu aplikacji, że konfiguracja została anulowana, a host nie doda widżetu:
Kotlin
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_CANCELED, resultValue)
Java
int resultValue = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(Activity.RESULT_CANCELED, resultValue);
Skonfiguruj widżet zgodnie z preferencjami użytkownika.
Po zakończeniu konfiguracji uzyskaj instancję
AppWidgetManager, wywołującgetInstance(Context):Kotlin
val appWidgetManager = AppWidgetManager.getInstance(context)
Java
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
Zaktualizuj widżet za pomocą układu
RemoteViews, wywołującupdateAppWidget(int,RemoteViews):Kotlin
val views = RemoteViews(context.packageName, R.layout.example_appwidget) appWidgetManager.updateAppWidget(appWidgetId, views)
Java
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget); appWidgetManager.updateAppWidget(appWidgetId, views);
Utwórz intencję zwrotną, ustaw ją z wynikiem aktywności i zakończ aktywność:
Kotlin
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_OK, resultValue) finish()
Java
Intent resultValue = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_OK, resultValue); finish();
Przykład znajdziesz w
ListWidgetConfigureActivity.kt
przykładowej klasie w GitHubie.
Opcje konfiguracji widżetu
Domyślnie host widżetu aplikacji uruchamia aktywność konfiguracji tylko raz, bezpośrednio po dodaniu widżetu do ekranu głównego przez użytkownika. Możesz jednak określić opcje, które umożliwiają użytkownikom ponowne skonfigurowanie istniejących widżetów lub pominięcie początkowej konfiguracji widżetu przez podanie domyślnej konfiguracji widżetu.
Umożliwianie użytkownikom ponownego konfigurowania umieszczonych widżetów
Aby umożliwić użytkownikom ponowne konfigurowanie istniejących widżetów, określ flagę
reconfigurable
w atrybucie
widgetFeatures
appwidget-provider. Więcej informacji znajdziesz w przewodniku po deklarowaniu pliku
AppWidgetProviderInfo.xml dla więcej
informacji. Na przykład:
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures="reconfigurable">
</appwidget-provider>
Użytkownicy mogą ponownie skonfigurować widżet, dotykając go i przytrzymując, a następnie klikając przycisk Ponownie skonfiguruj oznaczony 1 na rysunku 1.
Używanie domyślnej konfiguracji widżetu
Możesz zapewnić użytkownikom lepsze wrażenia z korzystania z widżetu, umożliwiając im pominięcie początkowego kroku konfiguracji. Aby to zrobić, określ flagi
configuration_optional
i reconfigurable w polu widgetFeatures. Spowoduje to pominięcie uruchomienia aktywności konfiguracji po dodaniu widżetu przez użytkownika. Jak wspomnieliśmy
wcześniej, użytkownik może później ponownie skonfigurować widżet. Na przykład widżet zegara może pominąć początkową konfigurację i domyślnie wyświetlać strefę czasową urządzenia.
Oto przykład, jak oznaczyć aktywność konfiguracji jako możliwą do ponownego skonfigurowania i opcjonalną:
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>