Sådan laver du widgets

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

Artikel top billede

(Foto: Computerworld)

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/.

Navnenyt fra it-Danmark

Renewtech ApS har pr. 15. marts 2026 ansat Per Forberg som Account Manager for Sustainable Relations. Han skal især beskæftige sig med etablere nye partnerskaber med henblik på ITAD og sourcing kontrakter med hostingvirksomheder og strategiske slutbrugere. Han kommer fra en stilling som Nordic Key Account Manager hos Tesa. Han er uddannet hos Lund University og har en MBA i Management. Han har tidligere beskæftiget sig med at styrke salgsaktiviteter og partnerskaber på tværs af nordiske markeder. Nyt job

Per Forberg

Renewtech ApS

Renewtech ApS har pr. 1. april 2026 ansat Boris Sudar som Senior IT Specialist. Han skal især beskæftige sig med at sikre, at Renewtech cloudbaseret infrastruktur fortsætter på sit højeste niveau, mens han også skal drive system udvikling. Han kommer fra en stilling som Senior IT Specialist hos Eurowind Energy. Han har tidligere beskæftiget sig med Microsoft 365, Intune og sikker endepunktsstyring for hybrid og cloudbaseret infrastrukturer. Nyt job

Boris Sudar

Renewtech ApS

Immeo har pr. 1. marts 2026 ansat Theo Lyngaa Hansen som Consultant. Han kommer fra en stilling som Data Manager hos IDA. Han er uddannet i Business Administration & Data Science. Nyt job
Renewtech ApS har pr. 1. marts 2026 ansat Emil Holme Fisker som Customer Service Specialist. Han skal især beskæftige sig med at levere høj kvalitets kundeservice og hjælpe Renewtechs kunder med at få de rette løsninger til deres behov. Han kommer fra en stilling som Key Account Manager hos Camro A/S. Han er uddannet som salgselev hos Camro A/S. Han har tidligere beskæftiget sig med at udvikle gode kunderelationer, opsøgende salg og udvikling af salgsaktiviteter. Nyt job

Emil Holme Fisker

Renewtech ApS