ошибка диапазона при уменьшении моего указателя конца выбора - PullRequest
0 голосов
/ 11 ноября 2018

Я могу выделить / отменить выделение курсивом / unitalic для текста редактирования, но в одном сценарии, когда я перемещаю указатель конечного выбора в направлении указателя начала выбора, а затем нажимаю кнопку курсива или полужирного, это вызывает ошибку и вылетает из моего приложения. Я провел целый день, но не мог понять причину и решение. Пожалуйста, помогите.

мое кодирование курсивом такое же, как у жирного текста

 private void boldText2(){
   int typeface = Typeface.NORMAL;
   Spannable str = texto.getText();
   int selStart = texto.getSelectionStart();
   int selEnd = texto.getSelectionEnd();
   StyleSpan[] styleSpans = texto.getText().getSpans(selStart, selEnd, StyleSpan.class);

       for (StyleSpan styleSpan : styleSpans) {
           int oldStyle = styleSpan.getStyle();
           typeface = oldStyle;
           int spanStart = str.getSpanStart(styleSpan);
           int spanEnd = str.getSpanEnd(styleSpan);

           if (oldStyle == Typeface.BOLD_ITALIC) {
               str.setSpan(new StyleSpan(Typeface.ITALIC), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
               Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
           }
           if(oldStyle == Typeface.BOLD) {
               str.removeSpan(styleSpan);
               Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
           }

           if (spanStart < texto.getSelectionStart()) {
               str.setSpan(new StyleSpan(oldStyle), spanStart, selStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
               Log.d("TAG", "spanStart < texto.getSelectionStart");
               Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
           }

           if (spanEnd > texto.getSelectionEnd()) {
               str.setSpan(new StyleSpan(oldStyle), selEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
               Log.d("TAG", "spanEnd > texto.getSelectionEnd()");
               Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
           }

   }

   if (typeface != Typeface.BOLD) {
Log.d("TAG", "Bolding section entered");
      if (styleSpans.length > 0) {
          int lastSpanEnd = 0;
          for (StyleSpan styleSpan : styleSpans) {
              int oldStyle = styleSpan.getStyle();
              int spanStart = str.getSpanStart(styleSpan);
              int spanEnd = str.getSpanEnd(styleSpan);

              if (spanStart > lastSpanEnd) {
                  str.setSpan(new StyleSpan(Typeface.BOLD), lastSpanEnd, spanStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  Log.d("TAG", "spanStart > lastSpanEnd and is bolded 1st if condition");
                  Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
              }

              lastSpanEnd = spanEnd;
              str.removeSpan(styleSpan);


              if (spanStart < texto.getSelectionStart()) {
                  str.setSpan(new StyleSpan(oldStyle), spanStart, selStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  Log.d("TAG", "spanStart < texto.getSelectionStart()");
                  Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
              }

              if (spanEnd > texto.getSelectionEnd()) {
                  str.setSpan(new StyleSpan(oldStyle), selEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  Log.d("TAG", "spanEnd > texto.getSelectionEnd()");
                  Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
              }

              if (oldStyle == Typeface.ITALIC) {
                  str.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  Log.d("TAG", "Bold and Italic");
                  Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + "spanStart: " + spanStart + " spanEnd: " + spanEnd);
              }
          }

          if (selEnd != lastSpanEnd) {
              str.setSpan(new StyleSpan(Typeface.BOLD), selStart, selEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
              Log.d("TAG", "selEnd != lastSpanEnd");
              Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd);
          }
      }

      else {
          str.setSpan(new StyleSpan(Typeface.BOLD), selStart, selEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
          Log.d("TAG", "Last else Bold");
          Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd);
      }
  }

  }

Дает мне следующую ошибку

java.lang.IndexOutOfBoundsException: setSpan (-1 ... 0) начинается до 0

для этого кода

 if (spanStart < texto.getSelectionStart()) {
                   str.setSpan(new StyleSpan(oldStyle), spanStart, selStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                   Log.d("TAG", "spanStart < texto.getSelectionStart()");
                   Log.d("TAG", "selStart: " + selStart + " selEnd: " + selEnd + " spanStart: " + spanStart + " spanEnd: " + spanEnd);
               }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...