web-dev-qa-db-fra.com

SpannableString: est-il possible d'appliquer deux ou plusieurs RelativeSizeSpans?

J'essaie de construire un SpannableString de telle sorte qu'il ressemble à ceci:

enter image description here

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

42
manmal

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));
111
Norman

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);
13
gbero

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));
3
AlexPad

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);
}
1
Hitesh Sahu