java - removeSpan(styleSpans[i]) 从样式文本中删除以前的样式
问题描述
我正在尝试从所选文本中删除粗体文本,但是当我点击按钮时,它会取消我之前加粗的所有文本。似乎 removeSpan.styleSpan[i] 不关心我选择的文本的哪一部分,而是从整个粗体跨度字符串中删除粗体文本。
这是我在一个按钮下使用的代码
private void boldText(){
int selectionStartb = texto.getSelectionStart();
int selectionEndb = texto.getSelectionEnd();
if (selectionStartb > selectionEndb) {
int temp = selectionEndb;
selectionEndb = selectionStartb;
selectionStartb = temp;
}
if (selectionEndb > selectionStartb) {
Spannable str = texto.getText();
boolean BL = false;
StyleSpan[] styleSpans;
styleSpans = str.getSpans(selectionStartb, selectionEndb, StyleSpan.class);
// If the selected text-part already has BOLD style on it, then
// we need to disable it
for (int i = 0; i < styleSpans.length; i++) {
if (styleSpans[i].getStyle() == android.graphics.Typeface.BOLD) {
str.removeSpan(styleSpans[i]);
BL = true;
}
}
// Else we set BOLD style on it
if (!BL) {
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStartb, selectionEndb,
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
texto.setSelection(selectionStartb, selectionEndb);
}
}
解决方案
您正在使用以下文本:
Spannable str = texto.getText();
您正在搜索所选范围内的跨度:
styleSpans = str.getSpans(selectionStartb, selectionEndb, StyleSpan.class);
了解这里发生的事情很重要。您没有在选择中获得所有“跨区文本”,甚至没有获得所有StyleSpan
s;您将所有StyleSpan
s 应用于整个文本,只要它们中的至少一部分应用于所选范围。
换言之,即使您只选择了跨区文本的一部分,该StyleSpan
对象仍代表整个跨区文本。
您将不得不修改代码以处理所有不同的可能场景:
- 所选范围上没有跨度 -> 为所选范围添加跨度
- 所选范围与单个跨度完全匹配 -> 删除该跨度
- 所选范围完全跨越,但不覆盖整个范围 -> 删除现有范围并重新添加一个范围到先前跨越但未选择的范围
- 所选范围仅部分跨越,并覆盖整个范围 -> 删除现有范围并为所选范围添加范围
- 所选范围仅部分跨越,但不覆盖整个范围 -> 删除现有范围并为所选范围添加一个范围 + 先前跨越但未选择的范围
推荐阅读
- java - 无法从 Spring-Boot 容器连接到 MySQL
- php - 将登录用户从特定页面重定向到 Woocommerce 我的帐户页面
- javascript - Neo4j/React:解析 Neo4j 结果以用于 React
- mysql - MySQL SubString 提取精确部分
- bootstrap-4 - 引导网格 sm 或 xs 不工作
- python - 为什么这个for循环提前结束?蟒蛇 3.6
- python - 从“A”列中查找当前日期并在“B”列中更新当前时间(Excel 2010)
- r - 将分类变量传播到新的非布尔列中
- bigcommerce - BigCommerce 更改订单历史视图
- spring-boot - spring boot2.x 和 ehcache3.5 基于注解报错