Widget

Références :

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 »

Widget<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> dimensions in portrait orientationIn 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

Widget<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> dimensions in landscape orientation

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

2°) Définition des propriétés du widget :
Dans un fichier xml situé dans l’arborescence du projet res/xml on précise la taille et la hauteur selon la règle ci-dessus. Il est possible de préciser plusieurs tailles et hauteurs, pour cela il conviendra de réaliser autant de fichier xml que l’on souhaite. Il est aussi possible de définir la période (en millisecondes) de mise à jour du widget. Il n’est pas possible de définir une période < à 30 minutes. Si on souhaite cela il convient d’utiliser l’AlarmManager 

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.

3°) Dessin du Layout :
Autant qu’il y a de type de widget avec les dimensions désirées…
4°) Ecriture du provider :
C’est une classe java, extending AppWidgetProvider.
La classe la plus importante est la classe onUpdate qui est appelée à chaque intervalle défini. Dans cette classe on met à jour les éléments du widget (TextView, etc…). Une fois la classe appelée et les valeurs placées dans les éléments du widget
EN RESUME :
*  Une classe principale (notamment pour gérer l’alarme manager) qui aura pour tâche de gérer les paramètres du widget avec son layout associé.
* x classes java avec leurs fichiers xml (taille et périodicité d’update) associés pour chaque taille de widget
* dans chaque classe de widget,
OnUpdate :
– Affichage du Layout du widget « RemoteViews »,
– Gestion du click sur le widget « PendingIntent »,
– Gestion du click sur des boutons du widget « PendingIntent » et déclaration dans le manifest de l’intent
 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);  
OnReceive :
– Gestion des intents reçus :
* Si click sur bouton,
* Si Alarme déclenchée,
Pour effectuer un scrolling de texte dans un widget, placer dans le layout pour le textview dont le texte doit défiler :
    <TextView
        android:id="@+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" >

        <requestFocus
            android:duplicateParentState="true"
            android:focusable="true"
            android:focusableInTouchMode="true" />
    </TextView>

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Articles récents
Commentaires récents
fatima sur Bienvenue !
AdminDroid sur Bienvenue !
fatima sur Bienvenue !
Archives
Catégories
%d blogueurs aiment cette page :