Le développement de widgets pour la plate-forme Android implique un ensemble de tâches légèrement différent de celui du développement d'applications standard. Dans cette série de didacticiels, nous allons suivre le processus de développement d’un widget horloge analogique personnalisable. L'horloge sera basée sur la classe Android AnalogClock et personnalisée avec vos propres graphiques..
Jusqu'à présent, dans cette série sur le développement d'un widget d'horloge analogique personnalisé pour Android, nous avons défini le projet et créé les principaux éléments de conception. Dans cette partie, nous allons implémenter la classe de widget Java, gérer les mises à jour et également lancer l'application. Nous allons travailler sur deux classes Java, l’une étendant la classe AppWidgetProvider et l’autre une classe Activity qui démarrera si l’utilisateur tente de lancer l’application. Nous allons également travailler sur le fichier de mise en page pour l'activité de lancement. Après ce tutoriel, vous aurez un widget horloge qui fonctionnera et qui sera continuellement mis à jour pour refléter l’heure actuelle..
Dans la dernière partie de la série, nous allons permettre à l’utilisateur de choisir parmi la sélection de modèles d’horloge que nous avons créés la dernière fois..
Voici la troisième partie de notre série sur la création d'un widget d'horloge analogique Android personnalisable à l'aide de quatre didacticiels:
Les applications de widgets étendent la classe AppWidgetProvider dans Android, c'est donc ce que nous allons faire ici. Dans cette classe, vous pouvez indiquer les étapes de traitement permettant de mettre à jour votre widget lorsqu'il est exécuté sur l'écran d'accueil de l'utilisateur. Notre activité de lancement utilisera le fichier de présentation XML principal pour afficher une ressource String définie dans le premier tutoriel. Dans ce tutoriel, nous verrons également comment utiliser les icônes de lanceur (et éventuellement de prévisualisation) pour notre application de widget..
Vous vous souvenez peut-être que dans le premier tutoriel, nous avons décidé d'inclure une activité de lancement dans l'application de widget. Ce n'est pas une nécessité, mais offre quelques avantages. Les utilisateurs ne sachant pas comment lancer une application de widget verront les instructions pour la lancer. De plus, les appareils fonctionnant sous Android 4.0 ne parviennent parfois pas à inclure de nouvelles applications de widgets dans le menu, mais proposer une activité de lancement semble résoudre ce problème..
Lorsque vous avez créé votre projet dans Eclipse, si vous avez spécifié une activité initiale pour l'application, Eclipse aurait dû créer une classe Java pour celui-ci. En utilisant les étapes par défaut décrites dans la partie 1, vous devez avoir une classe Java dans votre package de projet nommée "CustomClockWidgetActivity" ou un autre nom si vous l'avez modifiée. Ouvrez ceci dans Eclipse - il devrait contenir le contour suivant:
// nom du paquet import android.app.Activity; importer android.os.Bundle; Classe publique CustomClockWidgetActivity étend l'activité / ** Appelée lors de la création de l'activité. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Si Eclipse n'a pas créé la classe, créez-la maintenant et ajoutez le code, en modifiant le nom de la classe si nécessaire. Nous pouvons réellement utiliser le comportement par défaut de cette classe d'activité principale et laisser le code tel quel. Notez que le code spécifie la disposition XML principale pour sa vue de contenu. Nous modifierons ensuite le fichier de présentation XML principal pour l'adapter aux détails de notre application de widget..
L’activité doit déjà être incluse dans votre fichier manifeste de projet comme suit:
Ici, nous indiquons que cette activité devrait commencer lorsque l'application est lancée. C’est ainsi que l’activité de lanceur est répertoriée dans le manifeste d’une application standard (non widget). Bien que notre widget fonctionne généralement en étant ajouté à l'écran d'accueil de l'utilisateur, nous fournissons une activité de lancement pour les raisons mentionnées ci-dessus..
Ouvrez le fichier de présentation XML principal: "res / layout / main.xml". Eclipse aurait dû créer ce fichier lors de la création du projet. La plupart de ce fichier peut rester avec le code par défaut, mais nous souhaitons ajouter l'attribut suivant à l'élément TextView pour améliorer la lisibilité:
android: padding = "10dp"
Votre fichier de présentation XML principal doit maintenant apparaître comme suit:
La mise en page affiche simplement la chaîne de texte "hello" que nous avons modifiée dans la première partie de cette série. La chaîne indique à l'utilisateur comment ajouter le widget à son écran d'accueil. N'oubliez pas que nous avons inclus deux versions de String, l'une dans le dossier "values" et l'autre dans le dossier "values-v14", afin de pouvoir personnaliser les instructions en fonction de la version d'Android installée par l'utilisateur..
Avec une application de widget, l'icône du lanceur apparaît dans les listes d'applications. Dans notre cas, il apparaîtra également dans le menu principal de l'appareil de l'utilisateur car nous avons fourni une activité de lancement. Vous pouvez créer une image d'aperçu pour votre widget si vous le souhaitez, mais si vous ne le faites pas, l'icône du lanceur apparaîtra dans les aperçus du widget. Pour les utilisateurs d'Android 4.0 ou version ultérieure, les widgets sont ajoutés à partir de l'onglet Widget du menu de l'appareil. Dans cette section du menu, l’aperçu apparaît ou l’icône du lanceur apparaît si aucun aperçu n’a été fourni. Sur les niveaux d'API précédents, l'aperçu ou l'icône apparaît dans le sélecteur de widgets, après avoir appuyé longuement sur l'écran d'accueil..
Pour notre widget horloge, nous utiliserons simplement une icône de lanceur. Créez donc le vôtre maintenant. Vous pouvez utiliser l'ensemble suivant si vous ne souhaitez pas encore concevoir le vôtre:
Utilisez le guide de taille maximale suivant pour vos icônes à chaque densité:
Si vous utilisez le nom de fichier "ic_launcher" pour l'icône de votre lanceur, vous ne devriez pas avoir à modifier le code car les outils utilisent par défaut ce nom. Vérifiez que votre projet utilise bien ce nom en ouvrant le fichier Manifest et en vérifiant l'attribut icon de l'élément d'application, qui doit apparaître comme suit:
android: icon = "@ drawable / ic_launcher"
Si ce n'est pas le cas, modifiez le code pour qu'il corresponde au nom que vous souhaitez utiliser pour l'icône de votre lanceur. Enregistrez vos copies de l'icône dans chaque dossier pouvant être dessiné, en vous rappelant d'utiliser le même nom dans chaque dossier (mais le contenu de l'image avec des tailles variées adaptées à chaque densité). Si vous créez vos propres icônes de lanceur, assurez-vous qu’elles reflètent bien l’apparence et le fonctionnement de votre widget horloge afin que les utilisateurs puissent intuitivement faire le lien entre l’icône et le widget..
Si vous souhaitez créer des images d'aperçu pour vos applications de widget, vous pouvez utiliser l'application Aperçu de widget. Exécutez une application de widget sur un AVD dans Eclipse (pour le widget de l'horloge, vous pouvez le faire à la fin de ce tutoriel ou du suivant) - assurez-vous qu'un espace de stockage sur carte SD est alloué à votre AVD. Ouvrez le menu de l'émulateur et sélectionnez l'application Widget Preview. Choisissez votre widget dans la liste. Une fois que l'image de votre widget apparaît, cliquez sur "Prendre un instantané" pour capturer un aperçu..
Vous pouvez ensuite enregistrer l'aperçu directement sur votre ordinateur depuis Eclipse. Pour ce faire, ouvrez la perspective DDMS, sélectionnez votre émulateur dans la vue Périphériques, puis accédez à l'image dans la vue Explorateur de fichiers (dans le répertoire de téléchargement de la carte SD). Sélectionnez le fichier d'image d'aperçu et cliquez sur le bouton "Extraire un fichier du périphérique" pour enregistrer l'image sur votre système de fichiers local..
Une fois que vous avez l'aperçu, copiez-le dans le (s) dossier (s) de votre projet et indiquez son nom dans votre fichier de propriétés de widget "res / xml", "appwidget-provider", aux côtés des dimensions, de la période de mise à jour et de la disposition initiale, à l'aide de l'attribut suivant:
android: previewImage = "@ drawable / clock_preview"
Ceci s’appliquerait à un fichier image nommé, par exemple, "clock_preview.png", enregistré dans chaque dossier pouvant être dessiné..
Passons maintenant à la classe Java pour notre widget horloge. Rappelez-vous que dans le manifeste du projet, nous avons inclus un élément récepteur indiquant une classe nommée "ClockWidget" - nous allons le créer ensuite. Prenez un moment pour regarder le manifeste maintenant avant de mettre en œuvre votre classe. Notez que l'élément récepteur inclut l'action "APPWIDGET_UPDATE" et spécifie des métadonnées comprenant le fichier XML "clock_widget" dans lequel nous avons défini les propriétés de base du widget..
Créez maintenant votre classe de widgets en cliquant avec le bouton droit de la souris ou en sélectionnant le package d'application principal dans le répertoire "src", en choisissant "Fichier", puis "Nouveau", "Classe" - entrez "ClockWidget" pour correspondre au nom indiqué dans le manifeste. Eclipse devrait ouvrir votre nouveau fichier de classe. Étendez la ligne de déclaration de classe d'ouverture comme suit:
Classe publique ClockWidget étend AppWidgetProvider
Vous devrez ajouter l'instruction d'importation suivante au-dessus de cette ligne en haut de la classe:
importer android.appwidget.AppWidgetProvider;
Ajoutez une variable d'instance dans la déclaration de classe comme suit:
Vues RemoteViews;
Cela nous permettra de faire référence à l'interface utilisateur / aux éléments visibles du widget, ce qui nécessite un processus légèrement différent dans les classes de widget et dans les classes d'activité. Les vues distantes nous ont permis de nous référer à la disposition du widget et aux vues qu’elle contient. Ceci est essentiel lors de la mise à jour et de la fourniture de fonctions interactives pour le widget. Vous aurez besoin d'une autre déclaration d'importation:
importer android.widget.RemoteViews;
Ensuite, ajoutez le contour de la méthode "onReceive" dans la classe comme suit:
public void onReceive (contexte de contexte, intention d'intention)
AppWidgetProvider hérite de cette méthode de la classe BroadcastReceiver. Dans le prochain tutoriel, nous utiliserons cette méthode pour gérer les clics sur le widget horloge. Pour le moment, il suffit de demander à Android de mettre à jour l'apparence du widget lors de l'exécution de la méthode. Ajoutez d'abord les instructions d'importation suivantes:
importer android.content.Context; importer android.content.Intent;
Dans la méthode "onReceive", incluez un test conditionnel pour vérifier si la méthode est en cours d'exécution car le widget doit être mis à jour:
// trouve l'action String action = intent.getAction (); // est-il temps de mettre à jour si (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals (action))
Ajouter une autre déclaration d'importation:
importer android.appwidget.AppWidgetManager;
Dans l’instruction "if", récupérez les vues à distance pour la présentation de notre widget, en instanciant la variable d’instance créée comme suit:
views = new RemoteViews (context.getPackageName (), R.layout.clock_widget_layout);
Notez que nous utilisons l'objet Context transmis à la méthode "onReceive" pour récupérer le nom du package. Nous spécifions le fichier de disposition de widget d'horloge sur lequel nous avons travaillé dans le dernier tutoriel - si vous avez utilisé un nom de fichier différent, modifiez ce code pour le refléter. Maintenant, mettez à jour le widget en ajoutant le code suivant, toujours dans l'instruction "if":
AppWidgetManager.getInstance (context) .updateAppWidget (intent.getIntArrayExtra (AppWidgetManager.EXTRA_APPWIDGET_IDS), vues);
Ici, nous utilisons AppWidgetManager pour appeler la mise à jour, en passant l'objet de vues à distance comme référence. Vous pouvez maintenant exécuter votre application de widget pour voir son apparence et son comportement par défaut. Lorsque l'application est initialement installée / lancée, l'activité de lancement est exécutée:
L'activité de lancement est purement informative, il est donc préférable de garder la simplicité, à moins que vous n'ayez un autre objectif. Autre que cela, n'hésitez pas à modifier son apparence de la manière que vous aimez. Les captures d'écran suivantes montrent le widget ajouté dans le menu de l'appareil de l'utilisateur sur Ice Cream Sandwich:
Notez que l'icône du lanceur apparaît dans le menu Widget. Si vous incluez une image d'aperçu et la listez dans votre widget XML, elle apparaîtra ici. Enfin, le widget horloge fonctionne sous sa conception par défaut:
Les éléments de base du widget Analog Clock sont maintenant terminés. Dans la prochaine et dernière partie de la série de didacticiels, nous allons implémenter pour permettre à l'utilisateur de choisir un modèle d'horloge. Le modèle d'horloge par défaut est actuellement affiché car dans le dernier tutoriel, nous avons défini les autres modèles comme étant invisibles. Nous allons gérer les clics des utilisateurs sur le widget en ajoutant des fonctionnalités à la classe de widgets. Nous utiliserons également une nouvelle activité pour afficher la sélection de modèles d'horloge à l'utilisateur, en détectant celle qu'ils sélectionnent et en mettant à jour l'apparence du widget en conséquence. Enfin, nous utiliserons l’application Préférences partagés pour stocker un enregistrement du widget sélectionné par l’utilisateur sélectionné, ce qui le rend personnalisable..