Pertanyaan Hapus garis bawah dari tautan di TextView - Android


Saya menggunakan dua textview untuk menampilkan tautan dari basis data, saya berhasil mengubah warna tautan tetapi saya ingin menghapus garis bawah

email.setText(c.getString(5));
    website.setText(c.getString(6));
    Linkify.addLinks(email, Linkify.ALL);
    Linkify.addLinks(website, Linkify.ALL);

Bisakah saya melakukannya dari XML atau Kode?


75
2017-11-04 12:55


asal


Jawaban:


Anda dapat melakukannya dalam kode dengan mencari dan mengganti URLSpan contoh dengan versi yang tidak digarisbawahi. Setelah Anda menelepon Linkify.addLinks(), panggil fungsinya stripUnderlines() ditempelkan di bawah ini pada masing-masing TextViews:

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

Ini membutuhkan versi URL URL yang disesuaikan yang tidak memungkinkan properti "garis bawah" TextPaint:

    private class URLSpanNoUnderline extends URLSpan {
        public URLSpanNoUnderline(String url) {
            super(url);
        }
        @Override public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

194
2017-12-16 17:18



Diberikan textView dan konten:

TextView textView = (TextView) findViewById(R.id.your_text_view_id);
String content = "your <a href='http://some.url'>html</a> content";

Berikut ini adalah cara ringkas untuk menghapus garis bawah dari hyperlink:

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

Ini didasarkan pada pendekatan yang disarankan oleh robUx4.

Untuk membuat tautan yang dapat diklik Anda juga perlu menelepon:

textView.setMovementMethod(LinkMovementMethod.getInstance());

20
2017-10-02 09:26



UnderlineSpan sudah ada, tetapi hanya dapat mengatur garis bawah.

Solusi lain adalah dengan menambahkan tidak ada rentang garis bawah pada setiap yang ada URLSpan. Jadi keadaan garis bawah dinonaktifkan sebelum melukis. Dengan cara ini Anda menjaga Anda URLSpan (mungkin kebiasaan) kelas dan semua gaya lain yang ditetapkan di tempat lain.

public class NoUnderlineSpan extends UnderlineSpan {
    public NoUnderlineSpan() {}

    public NoUnderlineSpan(Parcel src) {}

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}

Di sini adalah bagaimana Anda mengaturnya tanpa menghapus objek URLSpan yang ada:

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

10
2018-06-11 11:36



Kapanpun, cobalah hapus garis bawah URL dengan spannable saya menyarankan hanya hal-hal ini:

1> Membuat kelas Khusus:

private class URLSpanNoUnderline extends URLSpan {
            public URLSpanNoUnderline(String url) {
                super(url);
            }
            @Override public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
            }
        }

Ini membutuhkan versi yang disesuaikan URLSpan yang tidak memungkinkan properti "garis bawah" TextPaint

2> setSpan dengan teks yang bisa di-span:

spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);

Sini, spannableText adalah Objek SpannableString... !!!


2
2018-01-13 09:05



Saya telah menerapkan solusi yang menurut saya lebih elegan. Saya sudah membuat adat TextView. Dengan cara ini Anda tidak perlu mengeksekusi kode tambahan untuk setiap TextView dengan hyperlink.

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

Dan kode untuk 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);
    }
}

1
2017-11-06 10:32



Jika Anda menggunakan properti autolink Textview dan Anda ingin menghapus garis bawah, Anda dapat menggunakannya:

Pertama, perpanjang UnderlineSpan dan hapus garis bawah:

public class NoUnderlineSpan extends UnderlineSpan {

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}

Kedua, buat dan contoh NoUnderlineSpan, buat Spannable dari teks String dan atur rentang ke 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);
}

Referensi: http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563


1
2018-05-17 17:07



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

0
2018-06-05 07:52



Jika Anda hanya ingin teks dan tidak peduli tentang tautan URL

Ini akan MENGUPAS tautan tetapi MENJAGA teks

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

tidak ada kelas tambahan yang diperlukan

String content = "<a href='http://stackoverflow.com'>Stack Overflow</a> Rocks!";
textView.setText(stripLinks(content));

0
2017-11-04 07:58