我可以在Android布局中下划线文本吗?

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

660966 次浏览

如果您使用的是字符串资源 xml文件,它支持<b></b><i></i><u></u>等超文本标记语言,则可以实现。

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

上面的“接受”答案不起作用不是(当你尝试使用像textView.setText(Html.fromHtml(String.format(getString(...), ...)))这样的字符串时)。

文件所述,您必须转义(html实体编码)内部标签的开头括号为&lt;,例如结果应如下所示:

<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), ...)));

Strings.xml文件内容:

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

布局xml文件应该使用上面的字符串资源,并具有以下文本视图的属性,如下所示:

<TextViewandroid: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"/>

你可以试试

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

我遇到了一个问题,我正在使用自定义字体,并且使用资源文件技巧(<u>Underlined text</u>)创建的下划线确实有效,但Android设法将下划线转换为一种罢工槽。

我自己用这个答案在文本视图下面画了一个边框:https://stackoverflow.com/a/10732993/664449。显然,这对部分下划线文本或多行文本不起作用。

我知道这是一个迟到的答案,但我想出了一个工作得很好的解决方案……我从安东尼·福洛尼那里得到了在代码中对文本进行下划线的答案,并创建了一个TextView的子类来处理它。然后,只要你想有一个下划线的TextView,你就可以在XML中使用这个子类。

这是我创建的类:

import android.content.Context;import android.text.Editable;import android.text.SpannableString;import android.text.TextWatcher;import android.text.style.UnderlineSpan;import android.util.AttributeSet;import android.widget.TextView;
/*** Created with IntelliJ IDEA.* User: Justin* Date: 9/11/13* Time: 1:10 AM*/public class UnderlineTextView extends TextView{private boolean m_modifyingText = false;
public UnderlineTextView(Context context){super(context);init();}
public UnderlineTextView(Context context, AttributeSet attrs){super(context, attrs);init();}
public UnderlineTextView(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);init();}
private void init(){addTextChangedListener(new TextWatcher(){@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after){//Do nothing here... we don't care}
@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count){//Do nothing here... we don't care}
@Overridepublic void afterTextChanged(Editable s){if (m_modifyingText)return;
underlineText();}});
underlineText();}
private void underlineText(){if (m_modifyingText)return;
m_modifyingText = true;
SpannableString content = new SpannableString(getText());content.setSpan(new UnderlineSpan(), 0, content.length(), 0);setText(content);
m_modifyingText = false;}}

现在……每当您想在XML中创建下划线文本视图时,只需执行以下操作:

<com.your.package.name.UnderlineTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:gravity="center"android:text="This text is underlined"android:textColor="@color/blue_light"android:textSize="12sp"android:textStyle="italic"/>

我在此XML片段中添加了其他选项,以表明我的示例适用于更改文本颜色、大小和样式……

希望这有帮助!

试试这个代码

在xml

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

在代码

TextView textView = (TextView) view.findViewById(R.id.textview);textView.setText(Html.fromHtml(getString(R.string.my_text)));

祝你好运!

单线解决方案

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

有点晚了,但可能对某人有用。

对于Button和TextView,这是最简单的方法:

按钮:

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

最近绘制下划线文本的方法由Romain Guy在介质上描述,源代码在github上可用。这个示例应用程序公开了两种可能的实现:

  • 基于路径的实现,需要API级别19
  • 需要API级别1的基于区域的实现

在此处输入图片描述

我使用这个xml可绘制来创建一个底部边框,并将可绘制作为我的文本视图的背景

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item><shape android:shape="rectangle" ><solid android:color="@android:color/transparent" /></shape></item>
<item android:top="-5dp" android:right="-5dp" android:left="-5dp"><shape><solid android:color="@android:color/transparent" /><strokeandroid:width="1.5dp"android:color="@color/pure_white" /></shape></item></layer-list>

一个简单而灵活的xml解决方案:

<Viewandroid:layout_width="match_parent"android:layout_height="3sp"android:layout_alignLeft="@+id/your_text_view_need_underline"android:layout_alignRight="@+id/your_text_view_need_underline"android:layout_below="@+id/your_text_view_need_underline"android:background="@color/your_color" />

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

<TextViewandroid: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>

结果:

在此处输入图片描述

  1. 转到strings.xml资源文件
  2. 必要时在资源文件中添加带有超文本标记语言下划线标记的字符串。

strings.xml超文本标记语言下划线示例

  1. 在Java代码中调用字符串资源ID,如下所示:
sampleTextView.setText(R.string.sample_string);
  1. 输出应该有下划线的单词“Stackoverflow”。

此外,以下代码不会打印下划线:

String sampleString = getString(R.string.sample_string);sampleTextView.setText(sampleString);

相反,请使用以下代码保留富文本格式:

CharSequence sampleString = getText(R.string.sample_string);sampleTextView.setText(sampleString);

"您可以使用getString(int)或getText(int)来检索字符串。getText(int)保留应用于字符串的任何富文本样式。" Android留档。

请参阅留档:https://developer.android.com/guide/topics/resources/string-resource.html

我希望这能有所帮助。

只需使用字符串资源文件中的属性。

<string name="example"><u>Example</u></string>

更干净的方式而不是
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);方法是使用textView.getPaint().setUnderlineText(true);

如果您需要稍后关闭该视图的下划线,例如在RecyclerView中的重用视图中,textView.getPaint().setUnderlineText(false);

我简化了塞缪尔的答案:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><!--https://stackoverflow.com/a/40706098/4726718--><itemandroid:left="-5dp"android:right="-5dp"android:top="-5dp"><shape><strokeandroid:width="1.5dp"android:color="@color/colorAccent" /></shape></item></layer-list>

最简单的方法

TextView tv = findViewById(R.id.tv);tv.setText("some text");setUnderLineText(tv, "some");

还支持TextView子节点,如EditText、Button、Checkbox

public void setUnderLineText(TextView tv, String textToUnderLine) {String tvt = tv.getText().toString();int ofe = tvt.indexOf(textToUnderLine, 0);
UnderlineSpan underlineSpan = new UnderlineSpan();SpannableString wordToSpan = new SpannableString(tv.getText());for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {ofe = tvt.indexOf(textToUnderLine, ofs);if (ofe == -1)break;else {wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);}}}

如果你想的话

-可点击的下划线文本?

-在TextView的多个部分下划线?

然后查看此答案

在静态编程语言中可以使用扩展函数。这只能从代码中使用,而不是xml。

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

用法:

 tv_change_number.underline()tv_resend_otp.underline()

另一种解决方案是创建一个扩展TextView的自定义视图,如下所示

public class UnderLineTextView extends TextView {
public UnderLineTextView(Context context) {super(context);this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);}
public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);}
}

然后添加到xml中,如下所示

<yourpackage.UnderLineTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="underline text"/>

最受欢迎的答案是正确和最简单的。然而,有时你可能会发现,不是为某些字体工作,而是为其他字体工作。(这是我在处理中文时遇到的问题。)

解决方案是不要仅为您的TextView使用“WRAP_CONTENT”,因为没有额外的空间来绘制线条。您可以为TextView设置固定高度,或使用android: paddingVerticalWRAP_CONTENT。

HtmlCompat.fromHtml(String.format(context.getString(R.string.set_target_with_underline)),HtmlCompat.FROM_HTML_MODE_LEGACY)<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

注意xml文件中的Escape符号

现在回答这个问题已经很晚了,但是假设如果有人想动态获取文本,那么他们可以在他们的java代码中使用这一行简单的代码:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

在静态编程语言中:

yourTextView.paint?.isUnderlineText = true

非常紧凑的kotlin版本:

tvTitle.apply {text = "foobar"paint?.isUnderlineText = true}

如果您想在xml中实现这一点,请在资源中声明您的字符串并将该资源值放入超文本标记语言的下划线标记()中。在文本视图中,添加

android:text="@string/your_text_reference"

在字符串资源值中,

<string name="your_text_reference"><u>Underline me</u></string>

如果您想以编程方式实现此功能,请使用静态编程语言

textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG

或,

textView.text = Html.fromHtml("<p><u>Underline me</u></p>")

尝试类

为java

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

静态编程语言

textview.setPaintFlags(textview.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG)
     <com.google.android.material.textfield.TextInputEditTextandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:backgroundTint="@android:color/transparent"android:hint="@string/search_url"android:textColor="@color/coffee_color"android:textColorHint="@color/coffee_color"/>