Is it possible to have multiple styles inside a TextView?

后端 未结 18 2215
醉梦人生
醉梦人生 2020-11-21 17:34

Is it possible to set multiple styles for different pieces of text inside a TextView?

For instance, I am setting the text as follows:

tv.setText(line         


        
18条回答
  •  佛祖请我去吃肉
    2020-11-21 18:02

    It is more light weight to use a SpannableString instead of html markup. It helps me to see visual examples so here is a supplemental answer.

    This is a single TextView.

    // set the text
    SpannableString s1 = new SpannableString("bold\n");
    SpannableString s2 = new SpannableString("italic\n");
    SpannableString s3 = new SpannableString("foreground color\n");
    SpannableString s4 = new SpannableString("background color\n");
    SpannableString s5 = new SpannableString("underline\n");
    SpannableString s6 = new SpannableString("strikethrough\n");
    SpannableString s7 = new SpannableString("bigger\n");
    SpannableString s8 = new SpannableString("smaller\n");
    SpannableString s9 = new SpannableString("font\n");
    SpannableString s10 = new SpannableString("URL span\n");
    SpannableString s11 = new SpannableString("clickable span\n");
    SpannableString s12 = new SpannableString("overlapping spans\n");
    
    // set the style
    int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
    s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
    s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
    s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
    s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
    s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
    s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
    s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
    s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
    s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
    s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
    s11.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
        }
    }, 0, s11.length(), flag);
    s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
    s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
    s12.setSpan(new UnderlineSpan(), 4, 11, flag);
    
    // build the string
    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append(s1);
    builder.append(s2);
    builder.append(s3);
    builder.append(s4);
    builder.append(s5);
    builder.append(s6);
    builder.append(s7);
    builder.append(s8);
    builder.append(s9);
    builder.append(s10);
    builder.append(s11);
    builder.append(s12);
    
    // set the text view with the styled text
    textView.setText(builder);
    // enables clicking on spans for clickable span and url span
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    

    Further Study

    • Explain the meaning of Span flags like SPAN_EXCLUSIVE_EXCLUSIVE
    • Android Spanned, SpannedString, Spannable, SpannableString and CharSequence
    • Types of spans

    This example was originally inspired from here.

提交回复
热议问题