TextView의 링크에서 밑줄 제거-Android
두 개 textview
를 사용하여 데이터베이스의 링크를 표시하고 링크 색상을 변경했지만 밑줄을 제거하고 싶습니다.
email.setText(c.getString(5));
website.setText(c.getString(6));
Linkify.addLinks(email, Linkify.ALL);
Linkify.addLinks(website, Linkify.ALL);
XML이나 코드에서 할 수 있습니까?
코드에서 URLSpan
인스턴스를 찾아 밑줄이없는 버전으로 바꾸면 됩니다. 을 호출 한 후 각에 아래에 붙여 넣은 Linkify.addLinks()
함수를 호출하십시오 .stripUnderlines()
TextView
private void stripUnderlines(TextView textView) {
Spannable s = new SpannableString(textView.getText());
URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
for (URLSpan span: spans) {
int start = s.getSpanStart(span);
int end = s.getSpanEnd(span);
s.removeSpan(span);
span = new URLSpanNoUnderline(span.getURL());
s.setSpan(span, start, end, 0);
}
textView.setText(s);
}
이를 위해서는 TextPaint의 "underline"속성을 활성화하지 않는 URLSpan의 사용자 정의 버전이 필요합니다.
private class URLSpanNoUnderline extends URLSpan {
public URLSpanNoUnderline(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
textView 및 콘텐츠가 주어지면 :
TextView textView = (TextView) findViewById(R.id.your_text_view_id);
String content = "your <a href='http://some.url'>html</a> content";
다음은 하이퍼 링크에서 밑줄을 제거하는 간결한 방법입니다.
Spannable s = (Spannable) Html.fromHtml(content);
for (URLSpan u: s.getSpans(0, s.length(), URLSpan.class)) {
s.setSpan(new UnderlineSpan() {
public void updateDrawState(TextPaint tp) {
tp.setUnderlineText(false);
}
}, s.getSpanStart(u), s.getSpanEnd(u), 0);
}
textView.setText(s);
이것은 robUx4에서 제안한 접근 방식을 기반으로합니다.
링크를 클릭 할 수있게하려면 다음을 호출해야합니다.
textView.setMovementMethod(LinkMovementMethod.getInstance());
UnderlineSpan
이미 존재하지만 밑줄 만 설정할 수 있습니다.
또 다른 해결책은 기존 URLSpan
. 따라서 밑줄 상태는 페인팅 직전에 비활성화됩니다. 이렇게하면 URLSpan
(사용자 정의 가능) 클래스와 다른 모든 스타일 설정 을 유지할 수 있습니다.
public class NoUnderlineSpan extends UnderlineSpan {
public NoUnderlineSpan() {}
public NoUnderlineSpan(Parcel src) {}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
}
기존 URLSpan 개체를 제거하지 않고 설정하는 방법은 다음과 같습니다.
URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
for (URLSpan span: spans) {
int start = s.getSpanStart(span);
int end = s.getSpanEnd(span);
NoUnderlineSpan noUnderline = new NoUnderlineSpan();
s.setSpan(noUnderline, start, end, 0);
}
때마다 spannable로 URL 밑줄 을 제거 하려고 시도 하십시오 .
1> 사용자 정의 클래스 생성 :
private class URLSpanNoUnderline extends URLSpan {
public URLSpanNoUnderline(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
TextPaint의 "underline"속성을 활성화하지 않는 URLSpan 의 사용자 정의 버전이 필요합니다.
2> 스팬 가능한 텍스트가있는 setSpan :
spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);
여기서, spannableText은 의 객체입니다 SpannableString은 ...!
제 생각에는 더 우아한 솔루션을 구현했습니다. 나는 사용자 정의TextView
. 이렇게하면 모든 TextView
하이퍼 링크에 대해 추가 코드를 실행할 필요가 없습니다 .
package com.example.view;
import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.URLSpan;
import android.util.AttributeSet;
import com.example.utils.UrlSpanNoUnderline;
public class TextViewNoUnderline extends AppCompatTextView {
public TextViewNoUnderline(Context context) {
this(context, null);
}
public TextViewNoUnderline(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public TextViewNoUnderline(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setSpannableFactory(Factory.getInstance());
}
private static class Factory extends Spannable.Factory {
private final static Factory sInstance = new Factory();
public static Factory getInstance() {
return sInstance;
}
@Override
public Spannable newSpannable(CharSequence source) {
return new SpannableNoUnderline(source);
}
}
private static class SpannableNoUnderline extends SpannableString {
public SpannableNoUnderline(CharSequence source) {
super(source);
}
@Override
public void setSpan(Object what, int start, int end, int flags) {
if (what instanceof URLSpan) {
what = new UrlSpanNoUnderline((URLSpan) what);
}
super.setSpan(what, start, end, flags);
}
}
}
UrlSpanNoUnderline에 대한 코드 :
package com.jankstudios.smmagazine.utils;
import android.text.TextPaint;
import android.text.style.URLSpan;
public class UrlSpanNoUnderline extends URLSpan {
public UrlSpanNoUnderline(URLSpan src) {
super(src.getURL());
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
Textview 자동 링크 속성을 사용하고 있고 밑줄을 제거하려면 다음을 사용할 수 있습니다.
먼저 UnderlineSpan을 확장하고 밑줄을 제거합니다.
public class NoUnderlineSpan extends UnderlineSpan {
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
}
둘째, NoUnderlineSpan을 만들고 인스턴스화하고, String 텍스트에서 Spannable을 만들고 범위를 spannable로 설정합니다.
NoUnderlineSpan mNoUnderlineSpan = new NoUnderline();
if (yourTextView.getText() instanceof Spannable) {
Spannable s = (Spannable) yourTextView.getText();
s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK);
}
참조 : http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563
텍스트 만 원하고 URL 링크는 신경 쓰지 않는 경우
이 것 스트립 링크를하지만 보관 텍스트를
private Spannable stripLinks(String content) {
Spannable s = new SpannableString(content);
URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
for (URLSpan span : spans) {
s.removeSpan(span);
}
return s;
}
추가 수업이 필요하지 않습니다
String content = "<a href='http://stackoverflow.com'>Stack Overflow</a> Rocks!";
textView.setText(stripLinks(content));
여기 내 방법입니다
public static void removeUnderlines(Spannable p_Text) {
if (p_Text != null && p_Text.toString().length() > 0) {
URLSpan[] spans = p_Text.getSpans(0, p_Text.length(), URLSpan.class);
for (URLSpan span : spans) {
int start = p_Text.getSpanStart(span);
int end = p_Text.getSpanEnd(span);
p_Text.removeSpan(span);
span = new URLSpanNoUnderline(span.getURL());
p_Text.setSpan(span, start, end, 0);
}
}
}
이렇게 부르세요
AppController.removeUnderlines((Spannable) eventEmail.getText());
Appcontroller is my application class where i put this method so that i can access it from anywhere
For Xamarin users finding this post, here is how I got it to work:
- Create a custom span class to handle stripping out the underlines.
class URLSpanNoUnderline : URLSpan {
public URLSpanNoUnderline (string url) : base (url) {
}
public override void UpdateDrawState (TextPaint ds) {
base.UpdateDrawState (ds);
ds.UnderlineText = false;
}
}
- Create an extension method to find all url spans and replace them with our custom spans.
public static void StripUnderlinesFromLinks (this TextView textView) {
var spannable = new SpannableStringBuilder (textView.TextFormatted);
var spans = spannable.GetSpans (0, spannable.Length (), Java.Lang.Class.FromType (typeof (URLSpan)));
foreach (URLSpan span in spans) {
var start = spannable.GetSpanStart (span);
var end = spannable.GetSpanEnd (span);
spannable.RemoveSpan(span);
var newSpan = new URLSpanNoUnderline (span.URL);
spannable.SetSpan(newSpan, start, end, 0);
}
textView.TextFormatted = spannable;
}
public void setView()
{
TextView t=(TextView) findViewById(R.id.textView3);
t.setText(Html.fromHtml("<a href=http://www.urdusms.net > UrduSMS "));
t.setTextColor(Color.BLACK);
t.setGravity(Gravity.CENTER);
t.setMovementMethod(LinkMovementMethod.getInstance());
Spannable s = (Spannable) t.getText();
URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
for (URLSpan span: spans) {
int start = s.getSpanStart(span);
int end = s.getSpanEnd(span);
s.removeSpan(span);
span = new URLSpanline_none(span.getURL());
s.setSpan(span, start, end, 0);
}
t.setText(s);
}
//inner class is
private class URLSpanline_none extends URLSpan {
public URLSpanline_none(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
참고URL : https://stackoverflow.com/questions/4096851/remove-underline-from-links-in-textview-android
'program tip' 카테고리의 다른 글
Xcode 7, iOS 9로 프로젝트를 실행할 때 "애플리케이션 창에 애플리케이션 실행 종료시 루트 뷰 컨트롤러가있을 것으로 예상됩니다."오류 (0) | 2020.09.23 |
---|---|
.Contains () 사용자 정의 클래스 객체 목록 (0) | 2020.09.23 |
부트 스트랩 모달 너비를 늘리는 방법은 무엇입니까? (0) | 2020.09.23 |
캐시를 지운 후 npm이 작동하지 않음 (0) | 2020.09.23 |
Eclipse : 자바 스크립트 유효성 검사가 비활성화되었습니다. (0) | 2020.09.23 |