Haupttitel der Präsentation 15.09.2018 WIFI Bundesland
Grundlagen Widgets sind Elemente auf dem „Android-Desktop“, dem Home Screen Widgets bieten die Möglichkeit den Benutzern Informationen der App zu liefern Kurzinfos Anzahl versäumte Anrufe, ungelesene Mails, … Aktualisierte Daten Temperatur eines bestimmten Ortes, … Ansicht von gefilterten Daten To-Dos aus Liste mit Priorität „sehr hoch“ Kalendereinträge des aktuellen Tages Viele Widgets sind mit einer Applikation verknüpft, andere stehen für sich selber Da „Widget“ die Superklasse von z.B. Buttons ist, werden „Home Screen Widgets“ eigentlich „AppWidgets“ genannt
Umsetzung von AppWidgets sind BroadcastReceiver verwenden RemoteViews Drei Komponenten notwendig Layout für GUI (empfohlen XML, programmatisch möglich) XML mit Meta-Daten BroadcastReceiver zur Kontrolle des AppWidgets Layout-Größe HomeScreen ist ein Raster, Widgets sind ein oder mehrere Zellen dieses Rasters groß Größe wird gerundet, ca. Formel ist Höhe = 70dp * zellen – 30dp (1 Zelle = 40 dp, 2 Zellen = 110 dp)
Layout von Widgets Einsatz von Views und Layouts vor allem aufgrund von Sicherheit (AppWidget läuft im Kontext Home Screen) stark eingeschränkt Zugelassene Layouts sind FrameLayout, LinearLayout, RelativeLayout, GridLayout Erlaubte Views sind AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextView, ViewFlipper <LinearLayout […]> <TextView android:id="@+id/widget_text1" […]/> <TextView android:id="@+id/widget_text2" […]/> <Button android:id="@+id/widget_button1" […]/> </LinearLayout>
Meta-Daten von AppWidgets Im Ordner res/xml gespeicherte XML-Datei WICHTIG: Tag appwidget-provider mit sämtlichen wichtigen und notwendigen Daten für das Widget <?xml version ="1.0" encoding ="utf-8"?> <appwidget-provider android:initialLayout="@layout/widget_layout" -> Verweis auf XML android:minWidth="40dp" android:minHeight="40dp" -> min Höhe/Breite android:label="Mein erstes Widget!" -> Beschriftung für die Übersicht android:updatePeriodMillis="360000" -> Wie oft aktualisieren? android:resizeMode="none" -> Größe änderbar? (horizontal | vertical) />
Umsetzen von AppWidgets 1/2 Vererben von BroadcastReceiver Überschreiben von onUpdate(), onDeleted(), onDisabled() und onEnabled() Registrieren von Intent-Filtern für Broadcasts Es gibt eine gekapselte Klasse für 1) und 2) => AppWidgetProvider public class MeineAppWidget extends AppWidgetProvider { @Override public void onUpdate (Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { //Was passiert im update? }
Umsetzen von AppWidgets 2/2 Im Manifest als Receiver registrieren und Verweis auf Meta-Daten-Datei <receiver android:name=".MeineAppWidget" android:label="Meines!" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider_info" /> </receiver>
RemoteViews für AppWidgets 1/2 RemoteViews werden eingesetzt um Views in anderen Applikationen zu ändern Da AppWidget im HomeScreen laufen und geändert werden sollen, kommen RemoteViews zum Einsatz Tatsächlich durchgeführt werden die Änderungen durch den Einsatz eines AppWidgetManager. Dieser wird im onUpdate() des AppWidgetProviders übergeben oder mittels AppWidgetManager appWidMan = AppWidgetManager.getInstance(context); ComponentName thisWidget = new ComponentName(context, MeiWidget.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); geholt
RemoteViews für AppWidgets 2/2 In beiden Fällen werden so for (int i = 0; i < anzahl; i++) { int appWidgetId = appWidgetIds[i]; RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.widget_text1, "erste Zeile"); appWidgetManager.updateAppWidget(appWidgetId, views) } die Views aktualisiert. Zu beachten ist, dass ein AppWidget mehrfach zum Einsatz kommen kann, daher ist es notwendig, diese Schleife einzusetzen.
Interaktion mit AppWidget Klick auf AppWidget soll etwas bewirken, einrichten eines ClickListener Intent intent = new Intent(context, MeineAktivität.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); views.setOnClickPendingIntent(R.id.widget_text1, pendingIntent); Intent kann Aktivität, Dienst oder implizieter Intent (z.B. „öffne WebSite http://wifiwien.at“) sein Mehrere Buttons oder andere View-Elemente können mit unterschiedlichen Intents verbunden sein
Aktualisierung von AppWidgets Verwendung von AppWidget-updatePeriodMillis In Millisekunden angegebene Zeit, bis wieder onUpdate() aufgerufen wird Ressourcen-intensiv, da das Gerät „aufgeweckt“ wird um dieses Update durchzuführen => zurückhaltend einsetzen Alternativen: Intentfilter und onReceive() im Widget überschreiben Alarm
Konfiguration von AppWidgets 1/2 Wird aufgerufen, nach dem Benutzer AppWidget ausgewählt hat, bevor AppWidget am HomeScreen erscheint Zwei Möglichkeiten Konfiguration einzusetzen nur beim ersten Mal, dann löschen und neu um Konfiguration erneut durchzuführen Intent auf Konfigurations-Aktivität setzen Konfigurationsaktivität braucht Intent-Filter für <activity android:name=".WidgetConfigAct"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/> </intent-filter></activity> In Meta-Daten des appwidget-provider android:configure = “com.example.WidgetConfigAct"
Konfiguration von AppWidgets 2/2 In der Konfigurations-Aktivität einlesen von AppWidgetId appWidgetId=extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); Vorbereiten von Abbruch setResult(RESULT_CANCELED, null); Einrichten einer GUI zur Konfiguration von AppWidget
Wichtige Befehle XML-Layout wie Aktivität allerdings eingeschränkt XML-Meta-Daten in res/xml <appwidget-provider […] AppWidgetProvider onUpdate() Intent-Filter setzen RemoteViews views = new RemoteViews( context.getPackageName(), layout); appWidgetManager.updateAppWidget(appWidgetId, views) views.setOnClickPendingIntent()
Demonstration AppWidget das Zahl am Desktop anzeigt AppWidget das bei Klick impliziten Intent auslöst um WebSite von WIFI-Wien aufzurufen AppWidget mit Verbindung zu Applikation AppWidget mit Konfiguration nach Auswahl
Üben Erstellen Sie ein Widget mit einem TextView. Klick auf den TextView führt zu einer Applikation in der aus einer Liste mit den Zahlen von 1-100 eine ausgewählt werden kann. Auswahl einer Zahl aus der Liste führt zur Anzeige dieser Zahl im Widget. Erstellen Sie ein Widget, dessen Konfiguration die Möglichkeit bietet die Farbe des Textes der verwendeten TextView zu steuern. In diesem TextView steht die Bezeichnung der gewählten Farbe Erstellen Sie ein 3x1 Widget, das die Überschrift der letzten Nachricht auf orf.at (RSS verwenden) anzeigt
Zusammenfassung