You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TextView中BufferType.Normal与BufferType.Spannable的作用解析——为何两种类型均使文本显示下划线

嘿,我来帮你搞懂这两个BufferType的区别~先看你写的这段代码:

TextView tv1 = FindViewById<TextView>(Resource.Id.textView1); 
tv1.Text = "Text"; 
SpannableString wordtoSpan = new SpannableString(tv1.Text); 
wordtoSpan.SetSpan(new UnderlineSpan(), 0, tv1.Text.Length, 0); 
tv1.SetText(wordtoSpan, TextView.BufferType.Normal);

首先解释下为什么你用Normal或者Spannable都能看到下划线:因为你直接传入的是SpannableString对象,TextView不管你指定哪种BufferType,都会优先识别并应用这个带格式的字符串,所以下划线都会显示出来。接下来具体说两者的核心作用:

TextView.BufferType.Normal vs BufferType.Spannable

1. BufferType.Normal

  • 这是TextView默认的缓冲区类型,它会把传入的文本转换成一个不可变的CharSequence(要么是普通String,要么是SpannableString的不可变包装)。
  • 要是之后你想修改文本的样式(比如中途加个加粗、改个颜色),用这个类型的话,你必须重新创建一个新的Spannable对象,再调用SetText才能生效,没法直接修改现有缓冲区里的Span。
  • 适合文本内容和样式固定不变的场景,内存占用相对更省。

2. BufferType.Spannable

  • 用这个类型时,TextView会把传入的文本存储为一个可变的SpannableStringBuilder对象。
  • 之后你可以通过tv1.TextFormatted拿到这个可变缓冲区,直接修改里面的Span或者文本内容,不需要再调用SetText,界面会自动刷新。举个例子:
    var spannableBuffer = tv1.TextFormatted as Spannable;
    spannableBuffer.SetSpan(new ForegroundColorSpan(Color.Red), 0, 2, 0);
    
    这段代码运行后,TextView里前两个字符会直接变成红色,不用再调用SetText更新。
  • 适合需要动态修改文本样式或内容的场景,比如实时更新的弹幕、动态高亮的搜索结果这类需求。

简单总结:你当前的代码是提前做好了SpannableString再传给TextView,所以两种类型都能显示下划线;但如果后续有动态修改样式的需求,BufferType.Spannable会让你的操作更便捷。

内容的提问来源于stack exchange,提问作者user2111639

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:12:44