2012-04-02 2 views
3

원래 문자열 :안드로이드 텍스트 뷰 형식으로 여러 단어

LOREM ## ipsum의 ## 달러 호주 달러 ## ## ATEM 앉아. Lorem ipsum dolar sit ###em ##. 형식화하는 후

:

LOREM #ipsum 달러 호주 달러 #sit ATEM. Lorem ipsum dolar sit #atem.

하지만 마지막 하나만 포매팅하고 싶습니다. 아래 이미지를 참조하십시오.

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

편집

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

답변

4

패스 다른 개체 각각의 기간에 대한 나의 최종 해결책 :

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

은 각 범위에 대해 동일한 개체를 전달하고 있습니다 :

new ForegroundColorSpan(0xFF0099FF) 

범위 개체가 spannableStringBuilder에 존재

은이 경계는, 새로운 범위가 추가되지 변경됩니다.

3

나는 더 간단한 방법을 제안합니다. 서식 요구 사항이 기본 인 경우, 간단한 정규식 + Html.fromHtml()는 트릭을 수행해야합니다

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

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

    editContent.setText(mSpannedText); 
} 
+0

내 형식 기능을 업데이트했습니다. –

+0

REGEX 및 WEBVIEWS가 모두 마지막 리소스라고 생각합니다. 리소스를 많이 사용하므로 간단하지는 않습니다. –

+0

@ Jorge Aguilar,이 스 니펫이 웹보기를 생성한다고 생각하지 않습니다. 성능에 미치는 영향은 미미합니다. –

1

올바르게 그러나 첫 번째 토큰이 올바르게

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

를 사용한으로 삭제되지 않습니다 루프 최종 솔루션

토큰 길이가 1자인 경우에만 작동합니다. 선택한 토큰이기 때문에 ##이 텍스트가 제대로 편집 및 토큰의 모든 추적이 제거되도록합니다 이미 생성 된 변수 tokenLen

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

을 활용하는 위의 코드를 변경합니다.

관련 문제