2012-04-02 11 views
3

Original-String:Android Textview-Format mehrere Wörter

Lorem ipsum ## ## Dolar ## sitzen ## atem. Lorem ipsum dolar sitzen ## atem ##.

Nach Formating:

Lorem #ipsum dolar #sit atem. Lorem ipsum dolar sitzen #atem.

Aber nur die letzte hat die Formatierung ich will. Siehe Bild unten.

CODE

private void format() { 
    CharSequence text = editContent.getText(); 

    MovementMethod movementMethod = editContent.getMovementMethod(); 
    if ((movementMethod == null) || !(movementMethod instanceof LinkMovementMethod)) 
    { 
     editContent.setMovementMethod(LinkMovementMethod.getInstance()); 
    } 

    text = setSpanBetweenTokens(text, "##", new ForegroundColorSpan(0xFF0099FF), new UnderlineSpan(), new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      Toast.makeText(getApplicationContext(), "click", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    editContent.setText(text); 
} 

private static CharSequence setSpanBetweenTokens(CharSequence text, String token, CharacterStyle... characterStyle) { 
    int tokenLen = token.length(); 
    int start = text.toString().indexOf(token) + 1; 
    int end = text.toString().indexOf(token, start); 

    while (start > -1 && end > -1) 
    { 
     SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); 
     for (CharacterStyle c : characterStyle) { 
      spannableStringBuilder.setSpan(c, start, end, 0); 
     } 

     spannableStringBuilder.delete(end, end + tokenLen); 
     spannableStringBuilder.delete(start - 1, start); 

     text = spannableStringBuilder; 

     start = text.toString().indexOf(token) + 1; 
     end = text.toString().indexOf(token, start); 
    } 

    return text; 
} 

EDIT

Meine letzte Lösung

private void format() { 
    CharSequence text = editContent.getText(); 

    MovementMethod movementMethod = editContent.getMovementMethod(); 
    if ((movementMethod == null) || !(movementMethod instanceof LinkMovementMethod)) 
    { 
     editContent.setMovementMethod(LinkMovementMethod.getInstance()); 
    } 

    text = setSpanBetweenTokens(text, "##"); 

    editContent.setText(text); 
} 

private static CharSequence setSpanBetweenTokens(CharSequence text, String token) { 
    int tokenLen = token.length(); 
    int start = text.toString().indexOf(token) + 1; 
    int end = text.toString().indexOf(token, start); 

    while (start > -1 && end > -1) 
    { 
     SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); 

     spannableStringBuilder.setSpan(new ForegroundColorSpan(0xFF0099FF), start, end, 0); 
     spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 0); 
     spannableStringBuilder.setSpan(new ClickableSpan() { 
      @Override 
      public void onClick(View widget) { 
       Log.d("DEBUG", "Click"); 
      } 
     }, start, end, 0); 

     spannableStringBuilder.delete(end, end + tokenLen); 
     spannableStringBuilder.delete(start - 1, start); 

     text = spannableStringBuilder; 

     start = text.toString().indexOf(token) + 1; 
     end = text.toString().indexOf(token, start); 
    } 

    return text; 
} 

Antwort

4

Pass anderes Objekt für jede Spannweite:

spannableStringBuilder.setSpan(c, start, end, 0); 

Sie geben das gleiche Objekt für jede Spannweite:

new ForegroundColorSpan(0xFF0099FF) 

Wenn Spanne Objekt existiert in spannableStringBuilder dann ändert es Grenzen, nicht nur eine neue Spanne hinzugefügt wird.

3

Ich würde einen einfacheren Weg vorschlagen. Wenn Ihre Formatierung Bedürfnisse basisch sind, eine einfache regex + Html.fromHtml() sollte den Trick:

private void format() { 
    String mText = editContent.getText(); 

    Spanned mSpannedText = Html.fromHtml(mText.replaceAll("##(.*?)##)","<font color=\"0xFF0099\">#$1</font>"), 

    editContent.setText(mSpannedText); 
} 
+0

ich habe meine Formatfunktion aktualisiert –

+0

Ich denke, sowohl REGEX als auch WEBVIEWS sind die letzte Ressource, sie sind beide ressourcenintensiv und daher nicht gut für etwas Einfaches. –

+0

@Jorge Aguilar, ich glaube nicht, dass dieser Ausschnitt einen Webview erstellt. Der Leistungseinbruch ist vernachlässigbar. –

1

Die endgültige Lösung richtig Schleifen jedoch Ihre erste Token wird nicht korrekt, wie Sie

verwendet haben, gelöscht werden
int start = text.toString().indexOf(token) + 1; 

das würde nur funktionieren, wenn Ihr Token 1 Zeichen lang war. Da gewählten Token ## den obigen Code ändern, um die bereits erstellte Variable tokenLen

int start = text.toString().indexOf(token) + tokenLen; 

dies stellt sicher, Ihren Text bearbeitet richtig zu nutzen und alle Spuren Ihrer Token entfernt werden.

Verwandte Themen