如何从xamarin android中的超链接textview中删除下划线

时间:2018-01-13 09:33:18

标签: c# xamarin.android

说明

我在textview中使用了一个链接,当我点击它进入网页时。要创建链接,我使用了html的锚标记。

这是我创建链接

的xml文件
<TextView
        android:text="@string/Home"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="fill_horizontal"
        android:layout_weight="0.5"
        android:clickable="true"
        android:textColorLink="#b3b3b3"
        android:textSize="15dp"
        android:id="@+id/Terms" />

这是我创建链接

的string.xml文件
<string name="Home"><a href="https://www.google.co.in/ " style="color:rgb(179, 179, 179);text-decoration:none">Home</a>

我尝试使用css样式的text-decoration:none,它不起作用。

我也试过这个链接see here 因为spannable在c#

中不起作用

问题

如何从超链接中删除下划线?

This is the image showing the hyperlink with underline

3 个答案:

答案 0 :(得分:1)

  

如何从xamarin android

中的超链接textview中删除下划线

您在上面发布的链接是正确的。我简化了Reuben Scratton的代码,并且能够删除下划线。

URLSpanNoUnderline上课:

public class URLSpanNoUnderline : URLSpan
{
    public URLSpanNoUnderline(String url) : base(url)
    {
    }

    public override void UpdateDrawState(TextPaint ds)
    {
        base.UpdateDrawState(ds);
        ds.UnderlineText = false;
    }
}

从超链接TextView中删除下划线:

private void stripUnderlines(TextView textView)
{
    SpannableString s = new SpannableString(textView.Text);
    s.SetSpan(new URLSpanNoUnderline(textView.Text), 0, s.Length(), SpanTypes.ExclusiveExclusive);
    textView.SetText(s, TextView.BufferType.Spannable);
}

更新:

以下是解决点击问题的解决方法:

您可以使用ClickableSpan代替URLSpan来实现相同的功能。您可以参考my answer,然后像这样修改您的代码:

textview.MovementMethod = LinkMovementMethod.Instance;
textview.Text = GetString(Resource.String.Home);

SpannableString ss = new SpannableString(textview.Text);
ss.SetSpan(new MyClickableSpan(this), 0, ss.Length(), SpanTypes.ExclusiveExclusive);
textview.SetText(ss, TextView.BufferType.Spannable);

以下是MyClickableSpan代码:

class MyClickableSpan : ClickableSpan
{
    private MainActivity mainActivity;

    public MyClickableSpan(MainActivity mainActivity)
    {
        this.mainActivity = mainActivity;
    }

    public override void OnClick(View widget)
    {
        Intent browserIntent = new Intent(Intent.ActionView, Uri.Parse("https://www.google.co.in/"));
        mainActivity.StartActivity(browserIntent);
    }

    public override void UpdateDrawState(TextPaint ds)
    {
        base.UpdateDrawState(ds);
        ds.Color = Color.Red;
        ds.UnderlineText = false;
    }
}

答案 1 :(得分:0)

只需更新以下方法

顺序应为:设置文本颜色,调用基本方法,设置下划线模式

   public override void UpdateDrawState(TextPaint ds)
   {
        ds.LinkColor = Android.Graphics.Color.Blue.ToArgb();
        base.UpdateDrawState(ds);
        ds.UnderlineText = false;
   }

答案 2 :(得分:0)

如果您在TextView内容中混合了文本和url,York的答案将不起作用,它会将textview中的整个第一行文本设置为UrlSpan。相反,要保留网址实际应到达的位置,可以执行以下操作:

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

class URLSpanNoUnderline : URLSpan {
        public URLSpanNoUnderline (string url) : base (url) {
        }

        public override void UpdateDrawState (TextPaint ds) {
            base.UpdateDrawState (ds);
            ds.UnderlineText = false;
        }
    }