Basic4android V1.6 unterstützt jetzt auch Home Screen Widgets. Dieses Tutorial erklärt wie Sie Ihre eigenen Home Screen Widgets (auch App Widgets genannt) erstellen können.
Es ist wichtig zu verstehen daß die Widgets in einem anderen Prozess erstellt und verwaltet werden als der in dem Ihr Programm läuft. Die Home Screen Application enthält Ihre Widgets.
Das heißt daß man die Widgetviews nicht direkt aufrufen kann. Dafür verwenden wir ein spezifisches Objekt mit dem Namen RemoteViews das indirekten Zugriff auf die Widgets ermöglicht.
Widgets unterstützen nicht alle Viewarten. Nur folgende Views sind unterstützt:
- Button (default drawable)
- Label (ColorDrawable oder GradientDrawable)
- Panel (ColorDrawable oder GradientDrawable)
- ImageView
- ProgressBar (beide Modi)
Alle Views unterstützen das Click Event und keine andere Events.
Das Widgetlayout und die Widget-Konfiguration müssen in XML Dateien definiert werden. Während der Kompilation liest Basic4android die Layout-Datei welche mit dem Designer erstellt wurde und erstellt die XML Dateien.
Jedes Widget ist einem Service Modul zugewiesen. Über dieses Modul wird das Widget erstellt und aktualisiert.
Erstellung eines Widgets – Schritt bei Schritt
- Ein Service Modul anfügen. Beachten Sie daß das Service Modul das das Widget behandelt ein standard Service ist.
- Das Widget-Layout mit dem Designer erstellen. Zuerst ein Panel einfügen und dann die anderen Views in dieses Panel hinzufügen.
Das Widget Layout wird von diesem Panel erstellt.
- Ähnlichen Code, wie unten, in das Service Modul einfügen,:
- Kompilieren und das Programm starten. In den Homebildschirm gehen, lange auf den Bildschirm drücken und Sie werden Ihr Widget in der Widgetliste sehen.
ConfigureHomeWidget - ist ein spezielles Schlüsselwort. Beim Programmstart erstellt es das RemoteViews Objekt aus dem Layout und setzt die Events. Während dem Kompilieren erstellt der Compiler die nötigen Dateien basiert auf den Parametern diesen Schlüsselwortes.
Die vier Parameter sind: Layoutdatei, Eventname, Updateintervall und Widgetname.
Der Eventname - erstellt die Subs die die RequestUpdate und Disabled Events behandeln. Das Widget kann so konfiguriert werden daß es sich selbst automatisch aktualisiert. Die Zeitspanne (interval), in Minuten, definiert wie oft das Widget eine Aktualisierung aufruft. Ein '0' Wert hebt die automatische Aktualisierung auf. Das Widget zu oft aktualisieren hat eine negativen Effekt auf die Batterie. Der Minimalwert ist 30 Minuten.
Widgetname - der Name der in der Widgetliste angezeigt wird.
Da diese Argumente vom Compiler gelesen werden sind nur Strings und Zahlen erlaubt.
Events:
Der obige Code testet die Intentbenachrichtigung die dieses Service ausgelöst hat und verantwortlich ist für die Event Auslösung des Widgets. True wird zurückgegeben wenn ein Event ausgelöst wurde.
Das Widget löst zwei Event aus. RequestUpdate wird ausgelöst wenn das Widget eine eigne Aktualisierung benötigt. Es wird ausgelöst: nachdem das Widget auf den Bildschirm hinzugefügt wurde, nachdem das Gerät gebootet wurde, basiert auf der Aktualisierungszeitspanne (falls sie gesetzt wurde) oder nachdem die Applikation aktualisiert wurde.
Das Disabled Event wird ausgelöst wenn die letzte Instanz von Ihrem Widget vom Bildschirm entfernt wurde.
Wie schon oben erwähnt, alle Views unterstützen nur das Click-Event. Um das Click-Event eines Buttons abzufangen braucht man nur eine Routine Sub Button1_Click einzufügen (der Name der Sub muss dem Eventname Parameter gleich sein).
Zum Beispiel wenn man die Main-Activity starten will wenn man auf Button1 drückt kann man folgenden Code verwenden:
Widget ändern :
Es ist nicht möglich die Widgets direkt aufzurufen. Anstatt müssen wir eine von den RemoteView.Set Methoden verwenden.
Um, zum Beispiel, den Text von Label1 zu ändern müssen wir folgenden Code schreiben:
Nach allen Änderungen müssen wir noch rv.UpdateWidget aufrufen um das Widget zu aktualisieren.
Ein einfaches Beispiel ist beigefügt.
Das Beispiel fügt ein einfaches Widget an, es macht nichts besonderes.
Ein Widget löschen: Auf das Widget länger drücken und auf den Mülleimer schieben.
Beigefügte Datei:
HomeWidgets.zip
Es ist wichtig zu verstehen daß die Widgets in einem anderen Prozess erstellt und verwaltet werden als der in dem Ihr Programm läuft. Die Home Screen Application enthält Ihre Widgets.
Das heißt daß man die Widgetviews nicht direkt aufrufen kann. Dafür verwenden wir ein spezifisches Objekt mit dem Namen RemoteViews das indirekten Zugriff auf die Widgets ermöglicht.
Widgets unterstützen nicht alle Viewarten. Nur folgende Views sind unterstützt:
- Button (default drawable)
- Label (ColorDrawable oder GradientDrawable)
- Panel (ColorDrawable oder GradientDrawable)
- ImageView
- ProgressBar (beide Modi)
Alle Views unterstützen das Click Event und keine andere Events.
Das Widgetlayout und die Widget-Konfiguration müssen in XML Dateien definiert werden. Während der Kompilation liest Basic4android die Layout-Datei welche mit dem Designer erstellt wurde und erstellt die XML Dateien.
Jedes Widget ist einem Service Modul zugewiesen. Über dieses Modul wird das Widget erstellt und aktualisiert.
Erstellung eines Widgets – Schritt bei Schritt
- Ein Service Modul anfügen. Beachten Sie daß das Service Modul das das Widget behandelt ein standard Service ist.
- Das Widget-Layout mit dem Designer erstellen. Zuerst ein Panel einfügen und dann die anderen Views in dieses Panel hinzufügen.
Das Widget Layout wird von diesem Panel erstellt.
- Ähnlichen Code, wie unten, in das Service Modul einfügen,:
B4X:
Sub Process_Globals
Dim rv As RemoteViews
End Sub
Sub Service_Create
rv = ConfigureHomeWidget("LayoutFile", "rv", 0, "Widget Name")
End Sub
Sub Service_Start (StartingIntent As Intent)
If rv.HandleWidgetEvents(StartingIntent) Then Return
End Sub
Sub rv_RequestUpdate
rv.UpdateWidget
End Sub
Sub rv_Disabled
StopService("")
End Sub
Sub Service_Destroy
End Sub
ConfigureHomeWidget - ist ein spezielles Schlüsselwort. Beim Programmstart erstellt es das RemoteViews Objekt aus dem Layout und setzt die Events. Während dem Kompilieren erstellt der Compiler die nötigen Dateien basiert auf den Parametern diesen Schlüsselwortes.
Die vier Parameter sind: Layoutdatei, Eventname, Updateintervall und Widgetname.
Der Eventname - erstellt die Subs die die RequestUpdate und Disabled Events behandeln. Das Widget kann so konfiguriert werden daß es sich selbst automatisch aktualisiert. Die Zeitspanne (interval), in Minuten, definiert wie oft das Widget eine Aktualisierung aufruft. Ein '0' Wert hebt die automatische Aktualisierung auf. Das Widget zu oft aktualisieren hat eine negativen Effekt auf die Batterie. Der Minimalwert ist 30 Minuten.
Widgetname - der Name der in der Widgetliste angezeigt wird.
Da diese Argumente vom Compiler gelesen werden sind nur Strings und Zahlen erlaubt.
Events:
B4X:
Sub Service_Start (StartingIntent As Intent)
If rv.HandleWidgetEvents(StartingIntent) Then Return
End Sub
Das Widget löst zwei Event aus. RequestUpdate wird ausgelöst wenn das Widget eine eigne Aktualisierung benötigt. Es wird ausgelöst: nachdem das Widget auf den Bildschirm hinzugefügt wurde, nachdem das Gerät gebootet wurde, basiert auf der Aktualisierungszeitspanne (falls sie gesetzt wurde) oder nachdem die Applikation aktualisiert wurde.
Das Disabled Event wird ausgelöst wenn die letzte Instanz von Ihrem Widget vom Bildschirm entfernt wurde.
Wie schon oben erwähnt, alle Views unterstützen nur das Click-Event. Um das Click-Event eines Buttons abzufangen braucht man nur eine Routine Sub Button1_Click einzufügen (der Name der Sub muss dem Eventname Parameter gleich sein).
Zum Beispiel wenn man die Main-Activity starten will wenn man auf Button1 drückt kann man folgenden Code verwenden:
B4X:
Sub Button1_Click
StartActivity(Main)
End Sub
Es ist nicht möglich die Widgets direkt aufzurufen. Anstatt müssen wir eine von den RemoteView.Set Methoden verwenden.
Um, zum Beispiel, den Text von Label1 zu ändern müssen wir folgenden Code schreiben:
B4X:
rv.SetText("Label1", "This is the new text.")
'do more changes if needed
rv.UpdateWidget
Ein einfaches Beispiel ist beigefügt.
Das Beispiel fügt ein einfaches Widget an, es macht nichts besonderes.
Ein Widget löschen: Auf das Widget länger drücken und auf den Mülleimer schieben.
Beigefügte Datei:
Last edited: