首页 > 解决方案 > 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);
  }

}

标签: javaandroid

解决方案


您正在使用以下文本:

Spannable str = texto.getText();

您正在搜索所选范围内的跨度:

styleSpans = str.getSpans(selectionStartb, selectionEndb, StyleSpan.class);

了解这里发生的事情很重要。您没有在选择中获得所有“跨区文本”,甚至没有获得所有StyleSpans;您将所有StyleSpans 应用于整个文本,只要它们中的至少一部分应用于所选范围。

换言之,即使您只选择了跨区文本的一部分,该StyleSpan对象仍代表整个跨区文本。

您将不得不修改代码以处理所有不同的可能场景:

  • 所选范围上没有跨度 -> 为所选范围添加跨度
  • 所选范围与单个跨度完全匹配 -> 删除该跨度
  • 所选范围完全跨越,但不覆盖整个范围 -> 删除现有范围并重新添加一个范围到先前跨越但未选择的范围
  • 所选范围仅部分跨越,并覆盖整个范围 -> 删除现有范围并为所选范围添加范围
  • 所选范围仅部分跨越,但不覆盖整个范围 -> 删除现有范围并为所选范围添加一个范围 + 先前跨越但未选择的范围

推荐阅读