データベースからリンクを表示するために2つの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()
を呼び出した後、TextView
sのそれぞれに以下に貼り付けられた関数stripUnderlines()
を呼び出します。
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);
}
}
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);
}
いつでも、RL下線を削除するをspannableで試してみてください。
1> カスタムクラスの作成:
private class URLSpanNoUnderline extends URLSpan {
public URLSpanNoUnderline(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
これには、カスタマイズされたバージョンのRLSpanが必要です。これは、TextPaintの「アンダーライン」プロパティを有効にしません。
2> スパニング可能なテキストを含むsetSpan:
spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);
ここで、spannableTextはSpannableString ... !!!のオブジェクトです
私の考えでは、よりエレガントなソリューションを実装しました。 custom 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 autolinkプロパティを使用していて、下線を削除したい場合は、それを使用できます。
まず、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/3915656
これが私の方法です
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は私のアプリケーションクラスであり、どこからでもアクセスできるようにこのメソッドを配置します
テキストだけが必要で、URLリンクを気にしない場合
これは[〜#〜] strip [〜#〜]リンクですが、[〜#〜] keep [〜#〜]テキスト
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));
Xamarinユーザーがこの投稿を見つけた場合、次のように機能します。
class URLSpanNoUnderline : URLSpan {
public URLSpanNoUnderline (string url) : base (url) {
}
public override void UpdateDrawState (TextPaint ds) {
base.UpdateDrawState (ds);
ds.UnderlineText = false;
}
}
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;
}