Sometimes I write things, sometimes I don't.

To content | To menu | To search

Tag - Google

Entries feed - Comments feed

Friday 18 November 2011

Chaînes de caractères dynamiques

mobile.png Tout bon programmeur Android a pour habitude de lister toutes les chaînes de caractères (ou presque) dans le fichier res/values/strings.xml. A priori, seules les chaînes de caractères statiques ne peuvent être mises dans ce fichier. Mais, il existe des méthodes pour rendre ces chaînes un petit peu plus dynamique qu'elles n'y paraissent. Voyons tout ça.

1. Les formes plurielles

Les formes plurielles varient plus ou moins d'un langage à un autre. Par exemple, en français, on peut vouloir écrire :

  • Je ne possède pas de stylo.
  • Je possède un stylo.
  • Je possède des stylos.

L'API Android met à disposition plusieurs distinctions de formes plurielles grâce à 6 mot clés.

  1. zero, pour la quantité 0 ;
  2. one, pour la quantité 1 ;
  3. two, pour la quantité 2 ;
  4. few, pour représenter une petite quantité ;
  5. many, pour représenter une moyenne quantité ;
  6. other, pour représenter une quantité supérieure à une autre suivant la langue.

En français, on aura tendance à n'utiliser que zero, one et other.
Ainsi pour former les chaînes précédemment citées on mettra dans notre fichier res/values/strings.xml le code suivant :

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <plurals name="nombreDeStylos">
    <item quantity="zero">Je ne possède pas de stylo.</item>
    <item quantity="one">Je possède un stylo.</item>
    <item quantity="other">Je possède des stylos.</item>
  </plurals>
</resources>

Dans le code Java, on récupérera la bonne forme de cette manière.

final List<Stylo> stylos = getStylos();
final int count = stylos.size();
final String text = this.getResources().getQuantityString(R.plurals.nombreDeStylos, count, count);

2. Formatage des chaînes

Il peut être également utile d'afficher des nombres dans les chaînes de caractères comme par exemple : "Bonjour X, vous avez Y nouveaux messages !". Cela se fait de manière relativement simple grâce à la méthode String.format(String, Object...) de Java. Cette méthode est également invoquée automatiquement lors de l'utilisation de Context.getString(int, Object...). La chaîne de caractères à formater doit contenir quelques marques de formatage comme %1$s pour dire qu'il faut remplacer cette marque par le premier argument et que celui-ci est une chaîne de caractère ou encore %2$d pour dire qu'il faut mettre ici le second argument qui est un entier.
Ainsi dans le fichier res/values/strings.xml on écrira :

<string name="welcome_message">Bonjour %1$s, vous avez %2$d nouveaux messages !</string>

Et on utilisera le code Java suivant :

final String username = "toto";
final int mailCount = 10;
final String text = String.format(this.getResources().getString(R.string.welcome_message), username, mailCount);

On pourra aussi utiliser celui-ci :

final String username = "toto";
final int mailCount = 10;
final String text = this.getResources().getString(R.string.welcome_message, username, mailCount);

3. Conclusion

Comme on peut le voir Android met à disposition plusieurs méthodes pour manipuler les chaînes de caractères et les rendre aussi flexibles que possible tout en simplifiant un maximum le travail des traducteurs par exemple. Il ne reste plus qu'à exploiter ces possibilités pour créer un code simple et efficace.

Thursday 6 January 2011

Et quand l'activité a besoin d'un objet ?

mobile.pngJe ne me souviens pas avoir parlé de programmation Android par ici. ce billet est donc l’occasion de commencer l’exploration du merveilleux OS mobile que nous fournit gracieusement Google. J’ai un smartphone qui carbure avec Android depuis bientôt 2 ans et je ne m’étais intéressé que vaguement à la programmation d’applications dessus. Dans mon parcours universitaire, j’ai eu l’occasion d’aborder ce sujet et mon projet tuteuré consiste principalement à faire une application pour Android. Trêve de blabla, passons à l’action.

Je ne vais pas refaire un cours sur Android, nombre de tutoriaux et d’exemples sont disponibles sur la toile. Dans le cadre de mon projet, j’avais donc un souci pour passer de l’information d’une activité à une autre. En effet, seuls les types primitifs et quelques autres trucs peuvent être passés d’une activité à une autre. Malheureusement, pas moyen de faire voyager un objet “simple” sans modification. Il faut qu’il implémente soit Serializable (connu par tous les bons programmeurs Java) soit Parcelable (propre à Android), “pour les surprendre on peut aussi faire les deux” (private joke).

Dans le cas présent, nous allons voir comment faire en implémentant l’interface Parcelable car cela demande un peu plus de code et de compréhension. Considérons un objet Message, sa classe (de base) s’écrirait très simplement.

class_message.png
Pour pouvoir faire naviguer cet objet entre plusieurs activités, on va donc le faire implémenter l’interface citée précédemment. Et c’est ici qu’il faut penser à quelques ajouts bien précis. L’objet implémentant Parcelable doit contenir un champ static appelé CREATOR de type Parcelable.Creator. De plus, 2 méthodes seront à redéfinir. Notre classe message se transforme alors comme la suivante.

class_message_parcelable.png
À ce stade, tous nos objets de type Message pourront être transférés d’une activité à une autre. Pour cela, on va donc utiliser un Bundle avec la méthode putParcelable(Parcelable).

class_sender.png
À noter qu'en tant qu’identifiant de l’objet dans le bundle, j’ai mis son nom complet (package + classe) ce n’est pas un hasard. Maintenant, on peut voir comment récupérer l’objet dans l’activité qui va le réceptionner.

class_receiver.png
Voilà qui est fait. Remarquez qu’il n’y a pas besoin de “caster” l’objet de type Parcelable récupéré, je vous laisse deviner grâce à quoi. Je ne prétends pas que ma méthode soit la meilleure, ni la plus sécurisée, etc… Tout ce que je sais, c’est que pour l’instant ça marche. L’expérience venant en codant, j’en saurai davantage sur l’efficacité de cette technique plus tard. Toutes améliorations et/ou remarques sont les bienvenues.

Friday 23 October 2009

Un Hero m'a sauvé

Je l'attendais avec impatience ces derniers jours et il est enfin arrivé. J'en avais marre de mon HTC Diamond, enfin... j'en avais surtout marre de Windows Mobile 6 et de sa lenteur. J'aurais pu me tourner vers Windows Mobile 6.5 mais non quitte à changer de téléphone pour son système d'exploitation autant un prendre un bon. C'est donc pour ça que j'ai choisi le HTC Hero.

Pourquoi j'ai choisi ce téléphone ? Cette question pourrait appeler beaucoup de réponses avec des tas d'arguments. Moi, je l'ai choisi parce qu'il me plait c'est tout. Son design, son système d'exploitation et son interface sont très réussis.


Il est très simple d'utilisation et offre beaucoup de fonctionnalités (GPS, appareil photo 5 mégapixels, lecteur de carte micro SD dont une de 2 Go accompagne le téléphone, 3G+, et j'en passe). Le HTC Hero est le premier téléphone (de chez HTC donc) à avoir proposé l'interface Sense. C'est une surcouche un peu comme le TouchFlo3D sur Windows Mobile mais en beaucoup plus personnalisable. Grâce au 6 extensions de l'écran d'accueil (oui un peu comme le changement de bureau virtuel sous Ubuntu), on peut placer tout un tas de widgets qui peuvent aussi bien afficher la météo, donner accès aux contacts favoris, que modifier des paramètres du téléphone.

Je ne suis pas encore un fan des autres Facebook, Twitter, etc, mais le HTC Hero possède les logiciels qui vont biens pour exploiter les réseaux sociaux les plus populaires. Étant un grand utilisateur du stylet, j'ai été, au début, assez déstabilisé par son absence sur le Hero mais finalement, l'écran tactile est beaucoup mieux gérer et surtout beaucoup plus précis que sur le Diamond. Les fautes de frappe sont rares malgré le "tout au doigt". La coque du téléphone permet de bien le tenir en main et l'empêche de glisser.

Bref, un bon téléphone qui ne manquera pas de m'être utile. La rapidité de Android comparé à celle de Windows Mobile me surprend déjà agréablement. Je pense donc que le meilleur reste à venir.

Sunday 22 February 2009

Des applications mobiles

Le système d'exploitation pour mobile de Google ,nommé Android, va débarquer en France sous peu. SFR m'a récemment fait remplir un questionnaire en ligne pour savoir s'il pouvait me classer dans la catégorie des acheteurs potentiels du G1 de chez HTC. Malheureusement pour eux, ou heureusement peut-être (à plus long terme), mon oeil se dirige d'avantage vers le prochain Diamond. Même si mon PDA actuel tourne encore sous Windows Mobile, certains essaient d'inverser la tendance. C'est en partant de ça que j'ai fait quelques recherches et que je suis tombé sur un tutoriel qui m'a beaucoup intrigué et ne présage que de bonnes choses (pour moi). En le lisant, on comprend tout de suite que le SDK de Android est basé sur le langage Java. Et on sait combien je l'aime celui-ci. Si ça vous tente, n'hésitez pas à lire ce bref article, il est très simple à comprendre. Des notions de Java ne sont pas spécialement nécessaires, on peut aussi apprendre sur le tas. Pour ma part, je me tiens prêt à coder pour une utilisation future (je l'espère).

Sunday 7 September 2008

Winetricks

La plupart des linuxiens connaissent le populaire Wine. Ce logiciel est l'implémentation sous GNU/Linux de l'interface de programmation de Microsoft Windows. Cela signifie que l'on peut faire tourner, grâce à Wine, des programmes Windows théoriquement sans perte de performance. Certains débutants ont un peu de mal avec la configuration de cet outil, heureusement, un script permet de faire pas mal de choses.

Continue reading...