Android开发中如何获取带当前字体样式的Button等控件文本
核心原因
TextView#getText() 本身只返回文本本身的内容,你通过setTypeface()给控件设置的自定义字体属于控件层面的渲染配置,不是绑定在文本上的Span样式,所以自然不会包含在返回结果里。
实现方法
方法1:生成携带当前字体Span的Spannable文本
适用于需要拿到带样式文本对象、后续要做文本赋值/富文本处理的场景,所有TextView子类(Button、EditText、RadioButton等)都能用:
- 先取出控件的原始文本
- 读取控件当前生效的Typeface实例,构造对应字体的自定义Span
- 把这个Span应用到整段文本上,最终得到的CharSequence就自带当前控件的字体样式
参考代码:
fun getTextWithCurrentStyle(textView: TextView): CharSequence { val originText = textView.text ?: return "" val typeface = textView.typeface val spannable = SpannableStringBuilder(originText) // 给整段文本绑定当前控件的字体 spannable.setSpan( CustomTypefaceSpan(typeface), 0, spannable.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) // 如果是EditText这类有局部富文本样式的控件,先把原有Span拷贝过来再追加字体Span即可 return spannable }
提示:如果控件同时设置了粗体、斜体这类textStyle,构造TypefaceSpan的时候记得把这些样式属性合并进去,避免丢失粗/斜效果。
方法2:直接取控件绘制结果
如果你的需求只是保留视觉上的字体效果(比如做截图分享、内容导出),不需要拿到可编辑的文本对象,可以直接拉取控件的绘制缓存,得到的位图和你在页面上看到的效果完全一致:
textView.isDrawingCacheEnabled = true val styledContentBitmap = textView.drawingCache // 取完立刻关闭缓存,避免占用内存 textView.isDrawingCacheEnabled = false
注意事项
- 不要直接在
getText()返回的对象上添加Span,部分场景下这个返回值是只读的,直接修改会抛出异常,一定要新建SpannableStringBuilder拷贝原始文本后再操作。 - 如果控件存在局部不同的字体/样式,不要直接给整段文本加全局Span,先遍历原文本的Span区间,给不同区间分别匹配对应位置的Typeface即可。
内容的提问来源于stack exchange,提问作者Ankita Nayak
相关产品推荐
相关产品推荐

