2014-11-13 14 views
5

Sto sviluppando un'applicazione Android e ho bisogno di visualizzare HTLM (anche < li> tag) in un testo. Per farlo ho trovato questo TagHandler ma sollevare unAndroid TagHandler exception

java.lang.RuntimeException: arco paragrafo deve iniziare al punto confine

Ho provato a capire perché, ma mi rifugio Sono stato in grado di trovare una soluzione. Sono abbastanza nuovo per Android quindi per favore aiutami.

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); 
     } 
    } 
} 
+0

Penso che l'errore sia su output.setSpan() –

risposta

7

Trovato l'errore, semplicemente risolto aggiungendo questo if(start<output.length()) prima

output.setSpan() 

la correttezza e il codice di lavoro è questo:

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); 
     } 
    } 
    } 

Aggiornamento:

Dopo aver qualche altro problema con il codice a bove Ho sviluppato questo codice che funziona senza eccezioni, spero che sarebbe utile.

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); 
     } 
    } 

}