You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xamarin Android中如何去除TextView内超链接的下划线?

解决TextView超链接下划线问题(Xamarin/C#)

嘿,我完全懂你现在的困扰——用HTML的<a>标签给TextView加了跳转链接,想通过CSS的text-decoration:none去掉下划线却完全没用,参考Java的Spannable方法又没法直接在C#里生效。别担心,我给你两个适合Xamarin环境的解决方案,亲测有效:

方法一:自定义ClickableSpan(推荐,更灵活)

这个方法跳过HTML解析,直接用代码给文本添加点击事件和无下划线样式,步骤如下:

  1. 先把strings.xml里的HTML链接改成普通文本:
<string name="Home">Home</string>
  1. 在C#代码中创建自定义的ClickableSpan,并重写样式和点击逻辑:
// 找到TextView控件
TextView termsTextView = FindViewById<TextView>(Resource.Id.Terms);
string linkText = GetString(Resource.String.Home);
SpannableString spannableString = new SpannableString(linkText);

// 添加自定义点击Span
var customClickSpan = new CustomClickSpan();
spannableString.SetSpan(customClickSpan, 0, linkText.Length, SpanTypes.ExclusiveExclusive);

// 应用到TextView
termsTextView.TextFormatted = spannableString;
termsTextView.MovementMethod = LinkMovementMethod.Instance;
// 设置文字颜色(和你想要的一致)
termsTextView.SetTextColor(Android.Graphics.Color.Rgb(179, 179, 179));
  1. 定义CustomClickSpan类:
public class CustomClickSpan : ClickableSpan
{
    public override void OnClick(View widget)
    {
        // 处理跳转逻辑,打开目标网页
        var targetUri = Android.Net.Uri.Parse("https://www.google.co.in/");
        var browseIntent = new Intent(Intent.ActionView, targetUri);
        widget.Context.StartActivity(browseIntent);
    }

    public override void UpdateDrawState(TextPaint ds)
    {
        base.UpdateDrawState(ds);
        // 关键:禁用下划线
        ds.UnderlineText = false;
        // 确保文字颜色符合需求
        ds.Color = Android.Graphics.Color.Rgb(179, 179, 179);
    }
}

方法二:自定义TagHandler处理HTML标签

如果你坚持想用HTML的<a>标签,可以通过自定义TagHandler替换默认的URLSpan,从而去掉下划线:

  1. 保留你原来的strings.xml内容:
<string name="Home"><a href="https://www.google.co.in/" style="color:rgb(179, 179, 179);text-decoration:none">Home</a></string>
  1. 在C#代码中使用自定义TagHandler解析HTML:
TextView termsTextView = FindViewById<TextView>(Resource.Id.Terms);
string htmlContent = GetString(Resource.String.Home);

// 解析HTML并应用自定义TagHandler
var spannedText = Html.FromHtml(
    htmlContent, 
    Html.FromHtmlOptions.ModeLegacy, 
    null, 
    new CustomLinkTagHandler()
);

termsTextView.TextFormatted = spannedText;
termsTextView.MovementMethod = LinkMovementMethod.Instance;
  1. 定义CustomLinkTagHandlerCustomURLSpan
public class CustomLinkTagHandler : Html.ITagHandler
{
    public void HandleTag(bool opening, string tag, IEditable output, IXmlReader xmlReader)
    {
        // 处理闭合的<a>标签
        if (tag.Equals("a", StringComparison.OrdinalIgnoreCase) && !opening)
        {
            // 找到所有默认的URLSpan
            var existingSpans = output.GetSpans(0, output.Length, Java.Lang.Class.FromType(typeof(URLSpan)));
            foreach (URLSpan span in existingSpans)
            {
                int start = output.GetSpanStart(span);
                int end = output.GetSpanEnd(span);
                // 移除默认Span
                output.RemoveSpan(span);
                // 添加自定义无下划线的Span
                output.SetSpan(new CustomURLSpan(span.URL), start, end, SpanTypes.ExclusiveExclusive);
            }
        }
    }
}

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

    public override void UpdateDrawState(TextPaint ds)
    {
        base.UpdateDrawState(ds);
        // 去掉下划线
        ds.UnderlineText = false;
        // 覆盖颜色(避免HTML样式不生效)
        ds.Color = Android.Graphics.Color.Rgb(179, 179, 179);
    }
}

为什么之前的CSS没用?

Android的TextView对HTML的CSS支持非常有限,text-decoration:none这类CSS属性不在它的支持范围内,所以直接写在HTML里完全不会生效,必须通过替换Span的方式来修改链接样式。

内容的提问来源于stack exchange,提问作者Anish

火山引擎 最新活动