768

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

4

27 回答 27

1267

如果您使用的是字符串资源xml 文件,则可以实现它,该文件支持 HTML 标签,如<b></b>,<i></i><u></u>.

<resources>
    <string name="your_string_here">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);
于 2010-03-07T02:29:57.760 回答
586

你可以试试

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
于 2012-06-08T10:44:58.923 回答
74

上面的“已接受”答案不起作用(当您尝试使用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), ...)));
于 2012-03-31T10:22:00.920 回答
68

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"
    />
于 2012-04-11T06:04:25.933 回答
67

对于 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);
于 2015-09-04T08:41:53.940 回答
35

在 Kotlin中可以使用扩展功能。这只能从代码中使用,而不是 xml。

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

用法:

 tv_change_number.underline()
 tv_resend_otp.underline()
于 2018-08-16T11:36:34.923 回答
21

一条线解决方案

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

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

于 2015-03-17T05:46:26.113 回答
19

在 Kotlin 中做到这一点:

yourTextView.paint?.isUnderlineText = true

于 2020-04-05T08:44:38.443 回答
18

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

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

字符串.xml:

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

结果:

在此处输入图像描述

于 2017-05-05T11:26:05.497 回答
14

一种更清洁的方法而不是
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 方法是使用 textView.getPaint().setUnderlineText(true);

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

于 2018-03-14T00:49:33.473 回答
11

我知道这是一个迟到的答案,但我想出了一个效果很好的解决方案......我从 Anthony Forloney 那里得到答案,为代码中的文本添加下划线,并创建了一个 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()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public 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 中创建带下划线的 textview 时,您只需执行以下操作:

<com.your.package.name.UnderlineTextView
    android: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 片段中添加了其他选项,以表明我的示例适用于更改文本颜色、大小和样式...

希望这可以帮助!

于 2013-09-11T07:41:24.377 回答
11

Romain Guy 在medium上描述了绘制下划线文本的最新方法,并在GitHub 上提供了可用的源代码。此示例应用程序公开了两种可能的实现:

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

在此处输入图像描述

于 2016-06-30T08:59:44.257 回答
8

我使用这个 xml drawable 创建了一个底部边框,并将 drawable 作为背景应用到我的 textview

<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" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>
于 2016-11-20T15:54:21.270 回答
8

只需使用字符串资源文件中的属性,例如

<string name="example"><u>Example</u></string>
于 2017-08-23T12:15:25.867 回答
7

最简单的方法

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 的多个部分下划线?

然后检查这个答案

于 2018-05-13T19:01:09.803 回答
6

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

<View
  android: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" />
于 2017-03-31T12:35:50.813 回答
6

如果您想在XML中实现这一点,请在资源中声明您的字符串并将该资源值放入 HTML 的下划线标记 (<u></u>) 中。在 TextView 中,添加

android:text="@string/your_text_reference"

在字符串资源值中,

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

如果您想以编程方式实现此目的,请使用Kotlin

textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG

或者,

textView.text = Html.fromHtml("<p><u>Underline me</u></p>")
于 2020-11-27T05:20:54.390 回答
5

我简化了 Samuel的回答:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>
于 2018-04-16T22:31:01.197 回答
4

试试这个代码

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

祝你好运!

于 2014-08-04T11:11:38.933 回答
4

另一种解决方案是创建一个扩展 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.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />
于 2018-11-04T12:46:46.993 回答
3

非常紧凑的 kotlin 版本:

tvTitle.apply { 
    text = "foobar"
    paint?.isUnderlineText = true
}
于 2020-09-17T10:06:43.537 回答
2
  1. 转到 strings.xml 资源文件
  2. 必要时在资源文件中添加带有 HTML 下划线标记的字符串。

strings.xml HTML 下划线示例

  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) 保留应用于字符串的任何富文本样式。” 安卓文档。

参考文档:https ://developer.android.com/guide/topics/resources/string-resource.html

我希望这有帮助。

于 2017-07-30T07:47:02.590 回答
2

投票最多的答案是正确且最简单的。但是,有时您可能会发现不适用于某些字体,而适用于其他字体。(我在处理中文时遇到了这个问题。)

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

于 2019-01-29T11:16:00.023 回答
1
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 文件中的转义符号

于 2019-02-20T09:42:14.170 回答
0

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

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));
于 2020-03-06T14:45:30.943 回答
0

尝试类

对于java

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

对于科特林

textview.setPaintFlags(textview.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG)
于 2021-12-14T14:57:45.917 回答
-2

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

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

于 2013-07-12T09:00:31.120 回答