I'm developing an Android App and I need to display HTLM (also < li> tags) into a textView. To do so I've found this TagHandler but it raise a
java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
I've tryed to understand why, but I haven't been able to find a solution. I'm quite new to Android so please help me.
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);
}
}
}
Found the error, simply solved by adding this if(start<output.length())
before
output.setSpan()
The correct and working code is this:
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);
}
}
}
Update:
After having some other trouble with the code above I've developed this code which work without exception, I hope it would be useful.
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);
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With