Artikel top billede

(Foto: Computerworld)

Sådan laver du widgets

Kom hurtigt i gang med at lave widgets til din Android-smartphone.

Af Kenneth Geisshirt, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Som bruger af Android-telefoner kender du uden tvivl de små nyttige widgets. En widget er et lille program – eller app, om du vil – som er placeret på hjemmeskærmen og løbende holder dig opdateret med et eller andet. Langt de fleste Android-brugere har nok et ur, en kalender eller vejrudsigter kørende. En af mine ynglingswidgets er en widget, som fortæller, hvor mange som er logget ind på den Mincraft-server, som jeg administrerer for mine børn.

Det er naturligvis muligt at udvikle egne widgets. Det er lettest at oprette et Android-projekt specielt til en widget, selvom den logisk hænger sammen med en app.

I Eclipse kan du oprette nye Android-projekter i samme workspace, som du ellers bruger til Android-udvikling. Det kan være en fordel at slå ’Create Activity’ fra.

Når du har oprettet et nyt Android-projekt til dine widgets, skal du oprette en Android-klasse, som skal være kernen af din widget. Under oprettelsen af klassen skal du vælge android.appwidget.AppWidgetProvider som superklasse. Sagen er nemlig den, at widgets er en særlig type app i Android-universet – og det viser du ved at bruge denne klasse.

Som ved en normal app skal du rette lidt i filen AndroidManifest.xml. Din widget skal modtage intents, og det klarer du ved at tilføje følgende til dit manifest:

<receiver android:name=".AodWidget" android:label="AodWidget">
<intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/aodwidget_provider" />
</receiver>

Din widget skal naturligvis have et skærmlayout, og som ved apps kan du redigere dette direkte i xml i filen main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/WidgetLayout"
android:layout_height="200dp"
android:layout_width="160dp"
android:orientation="horizontal">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:textColor="@android:color/black"
android:text="Loading"
android:textSize="8pt" />
</LinearLayout>

Widgets er en smule forskellige fra normale apps, og du skal fortælle, hvor stor din widget skal være. Det gør du i filen aodwidget_provider.xml i folderen values/xml:

<?xml version="1.0" encoding="utf-8"?>

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dp"
android:initialLayout="@layout/main"
android:updatePeriodMillis="1000"
android:minHeight="144dp"/>

Du skal være varsom med attributten updatePeriodMillis. Her i eksemplet er den sat til 1 s (1.000 ms). Det er typisk al for hurtig opdatering af en widget. Du vil opleve, at batteriet i telefonen drænes nærmest øjeblikkeligt ved så hurtig en opdatering.

Endelig er vi nået frem til koden. Selve widget-klassen skal have metoden onOpdate, som kaldes, hver gang din widget skal opdateres. Koden kan være så enkelt som følgende:

package dk.aod.aodwidget;

import java.text.DateFormat;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Locale;

import android.appwidget.AppWidgetManager;
import
android.appwidget.AppWidgetProvider;
import
android.content.ComponentName;
import
android.content.Context;
import
android.util.Log;
import
android.widget.RemoteViews;

public
class AodWidget extends AppWidgetProvider {

@Override

public
void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {

RemoteViews remoteViews;

ComponentName aodWidget;

DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault());

remoteViews =new RemoteViews(context.getPackageName(), R.layout.main);

aodWidget = newComponentName(context, AodWidget.class);

remoteViews.setTextViewText(R.id.WidgetLayout,"Date = "+ format.format(new Date()));

appWidgetManager.updateAppWidget(aodWidget, remoteViews);

}

}

1. http://developer.android.com/guide/topics/appwidgets/index.html.

2. http://kasperholtze.com/android/how-to-make-a-simple-android-widget/.