J'essaie de construire un SpannableString de telle sorte qu'il ressemble à ceci:
Deux caractères (m, s) doivent être plus petits que les autres. J'ai essayé de conserver tout le texte dans un SpannableString, et j'ai également essayé de concaténer deux SpannableStrings via un SpannableStringBuilder. Le code d'un Spannable ressemble à ceci:
spannable.setSpan(new RelativeSizeSpan(0.75f), spannable.length() - 1, spannable.length(), 0);
Cependant, une seule mise en forme est appliquée - lorsque vous utilisez SpannableStringBuilder, seul le "m" est plus petit et lorsque vous utilisez une SpannableString pour tout le texte, seul le "s" est plus petit.
Le débogage a également montré que les éléments extensibles semblent ne contenir qu'une seule instance de RelativeSizeSpan, ce qui signifie qu'il ne peut y avoir qu'une seule étendue d'un type. Est-ce un comportement vrai ou attendu? Serait-il préférable de concaténer TextViews à la place?
EDIT: Soit dit en passant, j'essaie de supprimer un appel HTML.fromHtml () ici pour des raisons de performances (de nombreux appels GC).
Si vous cherchez toujours une réponse, je pourrais avoir une solution. J'ai eu des problèmes similaires. J'ai utilisé TextUtils
pour concaténer les 2 SpannableString
.
Voici un exemple de code:
SpannableString span1 = new SpannableString("32m");
SpannableString span2 = new SpannableString("50s");
span1.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span2.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
mTextView.setText(TextUtils.concat(span1," " ,span2));
Vous n'avez pas besoin de 2 SpannableString séparés. Une solution plus courte peut être:
SpannableString span1 = new SpannableString("32m50s");
span1.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span1.setSpan(new RelativeSizeSpan(0.75f), 5, 6, 0);
mTextView.setText(span1);
Vous pouvez utiliser un tableau de SpannableString.
Comme dans ce cas:
TextView lblDescription=(TextView ) findViewById(R.id.lblDescription);
SpannableString[] finalString = new SpannableString[stringSplit.length];
lblDescription.setText(TextUtils.concat(finalString));
J'ai utilisé la version dynamique de la réponse de gbero dans mon projet,
public void updateTime(TextView tv) {
Calendar calendar = Calendar.getInstance();
SpannableString span = new SpannableString(
calendar.get(Calendar.HOUR_OF_DAY) + "h" + calendar.get(Calendar.MINUTE) + "m");
span.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span.setSpan(new RelativeSizeSpan(0.75f), 5, 6, 0);
tv.setText(span);
}