본문 바로가기

나의 플랫폼/안드로이드

[Android] TextView에 Autolink와 Hyperlink 함께 설정하기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

## TextView에 링크 적용하기


위 링크를 보시면 TextView에 Email이든 URL이든 TextView에 String 값을 통하여

자동적으로 링크가 적용 됩니다.


하지만, AutoLink 경우는 HTML 태그는 적용 되지 않습니다.

그래서 AutoLink를 설정 뿐만 아니라 HTML 태그를 변경 시켜야 합니다.


HTML 태그 적용은 다들 아시다 시피 아래 형태로 하면 됩니다.


이건 제가 즐겨 사용하는 함수 입니다.


public Spanned converTxtToHtml(String txt) {
Spanned result;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(txt,Html.FROM_HTML_MODE_LEGACY);
} else {
result = Html.fromHtml(txt);
}
return result;
}


위와 같이 text를 HTML으로 바꾼 상태 에서 

AutoLink를 설정 하면 동작이 잘 될듯 하지만,

HyperLink(A tag) 쪽이 적용이 되지 않습니다.


그래서 아래 소스는 HyperLink도 동작이 잘 이뤄지도록 설정 해주는 함수 입니다.


public SpannableStringBuilder convertTxtToLink(Context context, String html) {
CharSequence sequence = converTxtToHtml(html);
SpannableStringBuilder buffer = new SpannableStringBuilder(sequence);
URLSpan[] currentSpans = buffer.getSpans(0, sequence.length(), URLSpan.class);

for (URLSpan span : currentSpans) {
ClickUrlSpan clickUrlSpan = new ClickUrlSpan(context, span.getURL());
int start = buffer.getSpanStart(span);
int end = buffer.getSpanEnd(span);
buffer.setSpan(clickUrlSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

return buffer;
}


private class ClickUrlSpan extends ClickableSpan {
private Context mContext;
private String mUrl;

public ClickUrlSpan(@NonNull Context context, String url) {
super();
this.mContext = context;
this.mUrl = url;
}

@Override
public void onClick(View widget) {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(mUrl)));
}
}


소스는 SpannableStringBuilder 클래스를 통해서 URLSpan을 찾습니다.

URLSpan 위치에 ClickableSpan을 적용시키는 소스 입니다.


ClickableSpan은 해당 Span 부분을 클릭 할 경우,

해당 URL로 이동해주는 브라우저를 띄우는 소스 입니다.


즉, 아래 순서대로 변형 됩니다.

1. String 값을 HTML 태그 형태로 설정

2. HTML 태그 결과에 URL 관련 Span을 찾는다.

3. 해당 Span에 ClickableSpan을 적용 시킨다.

4. 커스터마이징을 한 ClickableSpan에서 해당 URL 웹브라우저로 이동


혹시 사용하고자 하는 분에게 좋은 참고 자료가 됐으면 합니다.