Member 14051127 Ответов: 1

Я получаю ошибку в стилизации и формировании моего edittext


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

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 ... 14) starts before 0


Что я уже пробовал:

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

1 Ответов

Рейтинг:
2

Richard MacCutchan

Как описано в разделе Выбор  |  Разработчики Android[^] вы можете получить -1 обратно. Вы всегда должны проверять возвращаемые значения в своем коде, а не просто предполагать, что они будут действительны.