我能否在Android布局中下划线文本?

809

我如何在 Android 布局 xml 文件中定义 下划线 文本?


这里我用示例描述了最佳实践。请查看此回答链接:[https://dev59.com/1Gsz5IYBdhLWcg3wOlSh#67087554]。 - Mayur Dabhi
29个回答

1321

如果您正在使用支持HTML标签(如<b></b><i></i><u></u>)的字符串资源XML文件,则可以实现。

<resources>
    <string name="your_string_here"><![CDATA[This is an <u>underline</u>.]]></string>
</resources>

如果您想要从代码中划下划线,请使用:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

58
您好,我尝试了上面的XML资源代码,但它没有起作用。它仍然将<u>下划线</u>显示为普通文本。 - Jono
4
另请参阅: android.text.Html.fromHtml()方法,它返回一个Spanned对象。 - Mark Renouf
3
你应该直接在strings.xml文件中输入文本,而不是使用添加按钮。否则,你的strings.xml文件中将会出现<u>,而在你的代码中将会出现<u>underline</u>。 - gdrt
3
我曾经遇到过使用<u>标签无法实现下划线的情况,例如当你使用自定义字体时。但是,通过UnderlineSpan编程实现下划线对我来说从未失败过,因此我建议它作为最可靠的解决方案。 - Giulio Piancastelli
30
在编辑器中可能看不到,但当您启动应用程序时,它将被下划线标出。 - jean d'arme
显示剩余6条评论

613
你可以尝试使用

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

4
或许这只是一个小问题,但OP希望在XML布局文件中定义它;否则,这是一个很好的解决方案。 - kwishnu
4
如果您想清除它,请使用此解决方案 - Bobs
2
这个解决方案也可以用于按钮。 - Rudy Kurniawan
4
如果您使用自定义字体或类似的东西,请注意,您可能还需要使用 | Paint.ANTI_ALIAS_FLAG,否则您的文本会看起来非常锐利。这种情况在较低的API中更为常见。 - Martin Marconcini
24
在 Kotlin 中:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG 的意思是将 TextView 的下划线文本标记设置为开启状态。 - Albert Vila Calvo
显示剩余2条评论

91

strings.xml文件的内容:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

布局XML文件应使用上述字符串资源,并在TextView的以下属性中使用,如下所示:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
请确保在实际的 XML 文件中编辑字符串资源文件,而不是在 Eclipse 的帮助编辑界面中进行编辑,因为它会转义 <s。 - Chris Rae

78
上面的“被接受”的答案不起作用(当您尝试像textView.setText(Html.fromHtml(String.format(getString(...), ...)))这样使用字符串时)。
文档中所述,您必须使用&lt;转义(HTML实体编码)内部标记的左尖括号,例如结果应该如下所示:
<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</string>
</resources>

然后在您的代码中,您可以使用以下方法设置文本:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

5
<u>这里划线的文本</u> 运作得很好。但是 <u>划线</u> 没有起作用。这个问题出现在 Android 2.2 版本,可能不同的版本会有不同的解释。 - user898763452
@autotravis,哪个是针对2.2版本的?我没有在旧版本上测试过它,如果不同版本处理方式不同,那将非常不幸...此外,至少当前文档说明必须进行转义(链接在答案中)。 - Ognyan
我已经在Android 2.3上测试了<u>下划线</u>,它可以正常工作。<u>下划线</u>在2.3上不起作用。文档中说:“有时您可能希望创建一个样式化的文本资源,该资源也用作格式化字符串。通常,这不起作用,因为String.format(String,Object ...)方法将从字符串中剥离所有样式信息。解决此问题的方法是编写具有转义实体的HTML标记,然后在进行格式化后使用fromHtml(String)进行恢复。”所以我想如果您通过String.format(...)方法运行它,您应该使用转义。 - user898763452
@autotravis 是的,你说得对。我使用它与 String.format(...) 一起。我已经编辑了我的答案,感谢你的反馈。 - Ognyan
在2.3和4.1(我目前尝试的版本)上,您可以直接使用textView.setText(getText(R.string.text)),而无需使用getString()、Html.fromHtml()和String.format()。 - Roy Solberg

74

对于按钮和文本视图,这是最简单的方法:

按钮:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

文本视图:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

42

Kotlin中可以使用扩展函数,但只能在代码中使用,不能在XML中使用。

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

使用方法:

 tv_change_number.underline()
 tv_resend_otp.underline()

39
要在 Kotlin 中实现这个功能:
你的代码TextView.paint?.isUnderlineText = true。

22

一行解决方案

myTextView.setText(Html.fromHtml("<p><u>我是下划线文本</u></p>"));

虽然有点晚,但对某些人可能仍有用。


22

看看带下划线的可点击按钮样式:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

结果:

这里输入图片描述


Widget.AppCompat.Button.Borderless.Colored的外观比下划线好得多,但正如@Kiril Vashilo所描述的那样,您仍然可以这样做。 - xarlymg89
1
为此,这将强制文本变成大写,给它一个大边框,并使其比默认文本更大。 - Jeffrey Blattman

16

另一种更简洁的方式,可以替代使用
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 方法,就是使用: textView.getPaint().setUnderlineText(true);

而如果你需要在以后关闭该视图的下划线,例如在 RecyclerView 中重用视图时,可使用textView.getPaint().setUnderlineText(false);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接