9
votes

Android: Comment combiner Spannable.SetSpan avec String.Format?

Je définit span à une partie du texte. Span elle-même fonctionne bien. Cependant, le texte est créé par string.format à partir de ressources et je ne sais pas Démarrer et fin de la partie in le texte que je vais mettre en place.

J'ai essayé d'utiliser des balises HTML personnalisées dans strings.xml , mais gettext ou getstring supprimez-les. Je pourrais utiliser quelque chose comme ça getstring (r.string.text, "" + arg + "") , puis html.fromhtml () , parce que le arg est exactement où je veux définir la portée.

J'ai vu Cette approche qui a utilisé le texte formé "Texte normal ## spann ici ## Texte normal" . Il analyse la chaîne supprime les étiquettes et les ensembles.

Ma question est la meilleure façon d'accomplir la couverture dans une chaîne formée comme "quelque chose% s quelque chose" ou devrais-je utiliser l'une des approches ci-dessus?


0 commentaires

4 Réponses :


2
votes

J'ai résolu ceci en introduisant taggedarg classe, les instances de cette classe se développent à valeur . Ensuite, j'ai créé un objet qui est responsable de la lecture de texte contenant des balises et de remplacer ces balises par des effectifs. Différentes étendues sont enregistrées dans la balise de la carte-> usine.

Il y avait une petite surprise. Si vous avez du texte comme " quelque chose quelque chose" , html.fromhtml lit ce texte comme " quelque chose ". Je devais ajouter des balises autour du texte entier pour éviter cela.


0 commentaires

6
votes

gettext () code> retournera SpanNedString code> d'objets contenant le formatage défini dans strings.xml. J'ai créé une personnalisation Version de String.Format CODE> qui conservera des effectifs dans la chaîne de format, même de ceux-ci joignent des spécificateurs de format (couvre-échantillons dans SpanNedString des arguments code> sont également préservés). Utilisez-le comme ceci:

Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux);


2 commentaires

La solution de George a parfaitement travaillé. Contrairement à certaines des autres solutions ici, George résout le problème d'essayer de remplacer les chaînes en utilisant le formateur habituel, tel que % 1 $ s qui peut être trouvé dans le fichier Strings.xml. Sa classe SPANFORDERSER fonctionne aussi facilement que la chaîne.Format, mais renvoie le SpanNedString pour travailler.


Bizarre, qu'il n'y a toujours pas de soutien officiel Android pour cette fonctionnalité simple mais toujours importante.



0
votes

La voie par gettext () que George supposé est intéressant. Mais il n'y a pas besoin d'écrire une classe supplémentaire. gettext () renvoie un charcuternence . Donc, utilisez SpannablestringBuilder pour définir ceci sur un TextView: xxx

dans votre string.xml Vous pouvez l'écrire avec des balises HTML (n'oubliez pas les citations avant et après le texte): xxx

Ce type de marquage a fonctionné pour moi soit la réglage manuellement vers un TextView (comme ci-dessus) ou l'attribuer dans une mise en page.


1 commentaires

Et si vous avez des paramètres pour la chaîne? Signification "Hello% S" dans le fichier Strings.xml, par exemple?



1
votes

J'ai décidé d'écrire une version de Kotlin de ce qui a été offert ici par George, au cas où le lien disparaît un jour: xxx


0 commentaires