103

データベースからリンクを表示するために2つを使用textviewしています。リンクの色を変更することはできましたが、下線を削除したい

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

XML または Code からそれを行うことはできますか?

4

12 に答える 12

235

インスタンスを見つけて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 の「下線」プロパティを有効にしないカスタマイズされたバージョンの URLSpan が必要です。

    private class URLSpanNoUnderline extends URLSpan {
        public URLSpanNoUnderline(String url) {
            super(url);
        }
        @Override public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }
于 2010-12-16T17:18:49.097 に答える
36

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());
于 2013-10-02T09:26:05.923 に答える
5

私の意見では、よりエレガントなソリューションを実装しました。カスタム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);
    }
}
于 2015-11-06T10:32:57.053 に答える
2

いつでも、 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 の「下線」プロパティを有効にしないカスタマイズされたバージョンのURLSpanが必要です。

2>スパン可能なテキストを含む setSpan :

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

ここで、spannableTextは SpannableString の Object ... !!!

于 2015-01-13T09:05:13.103 に答える
0

テキストのみが必要で、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));
于 2016-11-04T07:58:56.520 に答える