2016-06-15 12 views
0

Ich arbeite an einem Android-Projekt, das das Parsen von HTML (analysiert von Jsoup) in eine SpannableStringBuilder-Klasse beinhaltet.Wie kann man einen SpannableStringBuilder aufteilen und gleichzeitig formatieren?

Allerdings muss ich diese SpannableStringBuilder-Klasse von jedem neuen Zeilenzeichen in eine Liste aufgeteilt werden, sobald es analysiert wird, während seine Formatierung beibehalten wird.

, so dass ein segmentierter Text von

{ "Ich bin ein überspannte Text, \ n mich brüllen hören"}

würde sich in

{ "Ich bin ein übergreifender Text, „ “ hören me „ brüllen}

ich die Entwicklung auf Android recht neu bin, und alles, was in der Dokumentation nicht Spannweiten über Spucken oder auch eine Auflistung aller immer Formatierung auf einem aufgespannten finden konnten, Klasse, um mein eigenes zu bauen. So wird jede Hilfe sehr geschätzt.

+0

versucht 'Spanned # Teilfolge (int Start, int end)'? – pskink

Antwort

0

Ich habe es geschafft, das herauszufinden, nachdem ich die Methode untersucht habe, die pskink vorgeschlagen hat.

Meine Lösung war

@Override 
    public List<Spanned> parse() { 
     List<Spanned> spans = new ArrayList<Spanned>(); 
     Spannable unsegmented = (Spannable) Html.fromHtml(base.html(), null, new ReaderTagHandler()); 
     //Set ColorSpan because it defaults to white text color 
     unsegmented.setSpan(new ForegroundColorSpan(Color.BLACK), 0, unsegmented.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 

     //get locations of '/n' 
     Stack<Integer> loc = getNewLineLocations(unsegmented); 
     loc.push(unsegmented.length()); 

     //divides up a span by each new line character position in loc 
     while (!loc.isEmpty()) { 
      Integer end = loc.pop(); 
      Integer start = loc.isEmpty() ? 0 : loc.peek(); 

      spans.add(0,(Spanned) unsegmented.subSequence(start, end)); 
     } 

     return spans; 
    } 

    private Stack<Integer> getNewLineLocations(Spanned unsegmented) { 
     Stack<Integer> loc = new Stack<>(); 
     String string = unsegmented.toString(); 
     int next = string.indexOf('\n'); 
     while (next > 0) { 
      //avoid chains of newline characters 
      if (string.charAt(next - 1) != '\n') { 
       loc.push(next); 
       next = string.indexOf('\n', loc.peek() + 1); 
      } else { 
       next = string.indexOf('\n', next + 1); 
      } 
      if (next >= string.length()) next = -1; 
     } 
     return loc; 
    }