如何在安卓系统中复制粘贴文本时保留其原有字体样式?
问题根源
你当前使用的ClipData.newPlainText()方法仅支持存储纯文本内容,所有富文本样式(包括自定义字体、字重、颜色等格式)都会在存入剪贴板时被自动剥离,因此粘贴后仅能得到无样式的文本内容。
解决方案
改用ClipData.newHtmlText()存储带样式的富文本,存入前先将TextView的Spanned类型内容转成HTML格式,粘贴时再将HTML内容还原为带样式的文本即可:
存入剪贴板的修改后代码
textView.setOnClickListener(v -> { ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); // 将带样式的Spanned文本转换为HTML格式 String htmlContent = Html.toHtml((Spanned) textView.getText()); // 存储HTML格式的剪贴板内容 ClipData clipData = ClipData.newHtmlText("styled_data", textView.getText(), htmlContent); clipboardManager.setPrimaryClip(clipData); });
读取剪贴板还原样式的示例代码
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); // 判断剪贴板内容是否为HTML格式 if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML)) { ClipData.Item item = clipboardManager.getPrimaryClip().getItemAt(0); // 将HTML还原为带样式的Spanned文本 Spanned styledText = Html.fromHtml(item.getHtmlText(), Html.FROM_HTML_MODE_LEGACY); // 目标TextView需要提前设置好aguafina_script字体,才能正确渲染对应字体样式 targetTextView.setText(styledText); }
注意事项
- 若需要跨应用粘贴保留样式,需目标应用支持解析HTML格式的剪贴板内容,若目标应用仅接收纯文本,样式仍会丢失
- 自定义字体
aguafina_script需要在粘贴目标的运行环境中也引入了对应字体包,否则会自动降级为系统默认字体
内容的提问来源于stack exchange,提问作者Divyam Savsaviya
相关产品推荐
相关产品推荐

