Android TagHandler исключение

Я разрабатываю приложение для Android, и мне нужно отобразить HTLM (также теги

  • ) в textView. Для этого я нашел этот TagHandler, но он поднял

    java.lang.RuntimeException: диапазон PARAGRAPH должен начинаться с границы абзаца

    Я пытался понять, почему, но я не смог найти решение. Я совсем новичок в Android, поэтому, пожалуйста, помогите мне.

    public class HtmlTagHandler implements Html.TagHandler {
        private int mListItemCount = 0;
        private Vector<String> mListParents = new Vector<String>();
    
        @Override
        public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    
            if (tag.equals("ul") || tag.equals("ol") || tag.equals("dd")) {
                if (opening) {
                    mListParents.add(tag);
                } else mListParents.remove(tag);
    
                mListItemCount = 0;
            } else if (tag.equals("li") && !opening) {
                handleListTag(output);
            }
    
    
    
        }
    
    
    
        private void handleListTag(Editable output) {
            if (mListParents.lastElement().equals("ul")) {
                output.append("\n");
                String[] split = output.toString().split("\n");
    
                int lastIndex = split.length - 1;
                int start = output.length() - split[lastIndex].length() - 1;
                output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
            } else if (mListParents.lastElement().equals("ol")) {
                mListItemCount++;
    
                output.append("\n");
                String[] split = output.toString().split("\n");
    
                int lastIndex = split.length - 1;
                int start = output.length() - split[lastIndex].length() - 1;
                output.insert(start, mListItemCount + ". ");
                output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
            }
        }
    }
    
  • 1 ответ

    Решение

    Нашел ошибку, просто решил, добавив эту if(start<output.length()) до

    output.setSpan()
    

    Правильный и рабочий код:

    public class HtmlTagHandler implements Html.TagHandler {
        private int mListItemCount = 0;
        private Vector<String> mListParents = new Vector<String>();
    
        @Override
        public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    
            if (tag.equals("ul") || tag.equals("ol") || tag.equals("dd")) {
                if (opening) {
                    mListParents.add(tag);
                } else mListParents.remove(tag);
    
                mListItemCount = 0;
            } else if (tag.equals("li") && !opening) {
                handleListTag(output);
            }
    
    
    
        }
    
    
    
        private void handleListTag(Editable output) {
            if (mListParents.lastElement().equals("ul")) {
                output.append("\n");
                String[] split = output.toString().split("\n");
    
                int lastIndex = split.length - 1;
                int start = output.length() - split[lastIndex].length() - 1;
                if(start<output.length())
                    output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
            } else if (mListParents.lastElement().equals("ol")) {
                mListItemCount++;
    
                output.append("\n");
                String[] split = output.toString().split("\n");
    
                int lastIndex = split.length - 1;
                int start = output.length() - split[lastIndex].length() - 1;
                output.insert(start, mListItemCount + ". ");
                if(start<output.length())
                   output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
            }
        }
        }
    

    Обновить:

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

    public class HtmlTagHandler implements Html.TagHandler {
        private int mListItemCount = 0;
        private Vector<String> mListParents = new Vector<String>();
        private Vector<Integer> mListCounter = new Vector<Integer>();
    
    
        @Override
        public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    
            if (tag.equals("ul") || tag.equals("ol") ) {
                if (opening) {
                    mListParents.add(mListParents.size(),tag);
                    mListCounter.add(mListCounter.size(),  0);
    
                } else {
                    Log.d("Bohhh"," tolgo "+mListParents.get(mListParents.size()-1));
                    mListParents.removeElementAt(mListParents.size()-1);
                    Log.d("Bohhh","lunghezza "+mListParents.size());
                    mListCounter.removeElementAt(mListCounter.size()-1);
    
                }
    
            } else if (tag.equals("li") && opening) {
                handleListTag(output);
            }
    
    
    
        }
    
    
    
        private void handleListTag(Editable output) {
    
            if (mListParents.lastElement().equals("ul")) {
               if(output.length()!=0)
                output.append("\n");
                for(int i=1;i<mListCounter.size();i++)
                    output.append("\t");
                output.append("• ");
               } else if (mListParents.lastElement().equals("ol")) {
                mListItemCount=            mListCounter.lastElement()+1;
                if(output.length()!=0)
                output.append("\n");
                for(int i=1;i<mListCounter.size();i++)
                    output.append("\t");
               output.append( mListItemCount + ". ");
               mListCounter.removeElementAt(mListCounter.size()-1);
               mListCounter.add(mListCounter.size(), mListItemCount);
          }
        }
    
    }
    
    Другие вопросы по тегам