Android Tutorial Android Home Screen Widgets Tutorial - Teil I

klaus

Expert
Licensed User
Longtime User
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,:

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
- 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:

B4X:
Sub Service_Start (StartingIntent As Intent)
    If rv.HandleWidgetEvents(StartingIntent) Then Return
End Sub
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:

B4X:
Sub Button1_Click
 StartActivity(Main)
End Sub
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:
B4X:
rv.SetText("Label1", "This is the new text.")
'do more changes if needed
rv.UpdateWidget
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.

SS-2011.07.11-12.55.04.png



Ein Widget löschen: Auf das Widget länger drücken und auf den Mülleimer schieben.

Beigefügte Datei:
zip.gif
HomeWidgets.zip
 
Last edited:

Hodi

Member
Licensed User
Longtime User
Load csv in Widget...

Hi Klaus, ich möchte in dem Service Modul eine csv Datei laden und die werte daraus in einem Progresse bar anzeigen lassen.
Ist das möglich?
Gruß hodi
 
Top