Références :
http://www.devexchanges.info/2017/02/android-home-screen-widget-part-4.html?m=1
https://www.androidauthority.com/create-an-android-widget-1020839/
http://thetechnocafe.com/how-to-create-widget-for-your-android-app/
https://medium.com/beautycoder/6-things-about-widgets-b45980f49ca
https://openclassrooms.com/courses/creez-des-applications-pour-android/creer-un-appwidget#
http://blog.doityourselfandroid.com/2011/05/24/developing-android-home-screenwidgets/
Pour obtenir le « squelette » d’un widget, sous Studio, Click droit dans la partie Java et « New » « Widget »
1°) Dessin du Widget :
cf. http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
Attention, avec android 4.0, le widget a ses marges automatiquement calculées et peut être redimensionné.
pour le design : http://developer.android.com/design/downloads/index.html
Les paramétres minWidth
et minHeight
précisent la taille du widget. L’écran Android est divisé en 4 zones de 4 cellules. La taille du widget est calculées selon la formule :
size = (number of cells * 74) – 2
Un widget de 4 cellule de large sur 1 cellule de haut (occupant donc la largeur de l’écran sur 1/4 de la hauteur aura comme taille minWidth = (4 * 74) – 2 = 294 dps et minHeight = 72 dps.
ATTENTION : Il s’avère que la hauteur minimum est en fait de 40dp pour un widget de 4×1. Donc dans le fichier provider.xml, les paramètres seront de android:minWidth= »294dp » et android:minHeight= »40dp » dans le layout du widget android:layout_width= »320dp » et android:layout_height= »72dp »
In landscape orientation, each cell is 106 pixels wide by 74 pixels tall. The three supported widget sizes in landscape orientation are:
Cells | Pixels |
---|---|
4 x 1 | 424 x 74 |
3 x 3 | 318 x 222 |
2 x 2 | 212 x 148 |
Vous ne pouvez pas utiliser tous les composants. Seuls les layouts suivants sont acceptés :
-
FrameLayout
-
LinearLayout
-
RelativeLayout
Et les widgets acceptés :
-
AnalogClock
-
Button
-
Chronometer
-
ImageButton
-
ImageView
-
ProgressBar
-
TextView
2°) ÉTAPES POUR LE CODAGE :
1°) Définition du widget dans le manifest :
C’est une sorte de BroadCast
Le composant de base qui représente votre application est le AppWidgetProvider
, c’est donc lui qu’il faut déclarer dans le Manifest. Comme AppWidgetProvider
dérive de BroadcastReceiver
, il faut déclarer un nœud de type . Cependant, contrairement à un
BroadcastReceiver
classique où l’on pouvait ignorer les attributs android:icon
et android:label
, ici il vaut mieux les déclarer. En effet, ils sont utilisés pour donner des informations sur l’écran de sélection des widgets.
Il faut bien entendu rajouter des filtres à intents dans ce receiver, sinon il ne se lancera jamais. Le seul broadcast intent qui nous intéressera toujours est android.appwidget.action.APPWIDGET_UPDATE
qui est envoyé à chaque fois qu’il faut mettre à jour l’AppWidget.
La hauteur minimale de l’AppWidget est définie par android:minHeight
et sa largeur minimale avec android:minWidth
. Les valeurs à indiquer sont en dp comme pour le layout.
Ensuite, on utilise android:updatePeriodMillis
pour définir la fréquence de mise à jour voulue, en millisecondes. Ainsi, android:updatePeriodMillis="60000"
fait une minute. Puis on utiliseandroid:initialLayout
pour indiquer la référence au fichier XML qui indique le layout de l’AppWidget. Enfin, vous pouvez associer une activité qui permettra de configurer l’AppWidget avecandroid:configure
.
Intent active = new Intent(context, SampleWidgetProvider4_1.class);
active = new Intent(context, SampleWidgetProvider4_1.class);
active.setAction(ACTION_WIDGET_SETTINGS);
active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetId);
actionPendingIntent = PendingIntent.getBroadcast(context,
appWidgetId, active, PendingIntent.FLAG_CANCEL_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.Arriere,actionPendingIntent);
"@+id/word_text" style="@style/WidgetText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/icon" android:layout_below="@+id/word_title" android:layout_toLeftOf="@+id/ImageView01" android:layout_toRightOf="@+id/icon" android:duplicateParentState="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:singleLine="true" android:text="This is a very long text with a lot of test" > "true" android:focusable="true" android:focusableInTouchMode="true" />
Votre commentaire