我可以在Android版式中加下划线吗?


Answers:


1142

它可以,如果你使用的是可以实现字符串资源 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);

49
嗨,我尝试了上面的资源xml代码,它并没有起作用。它继续以纯文本显示<u>下划线</ u>
Jonathan

4
另请参阅:android.text.Html.fromHtml(),该函数返回Spanned。
Mark Renouf

3
您应该在strings.xml文件本身中键入它,而不要通过添加按钮来进行输入。否则,您将得到此&lt; u&gt; 在您的strings.xml文件中和<u>下划线</ u>在您的代码中
gdrt

3
我遇到过以下情况,即通过<u>标记的基础不起作用,例如,有时如果您使用的是自定义字体。但是,by编程基础UnderlineSpan并没有使我失望,因此我建议将其作为最可靠的解决方案。
Giulio Piancastelli 2014年

26
它不会显示在编辑器中,但是当您启动应用程序时-将带有下划线。
jean d'arme

532

您可以尝试

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

1
也许没有什么要紧,但是OP希望在XML布局文件中定义它;否则,这是一个很好的解决方案。
kwishnu

4
如果您想清除它,请使用此解决方案
Bobs

2
此解决方案也可以用于Button
Rudy Kurniawan

3
如果使用自定义字体或类似字体,请务必小心,| Paint.ANTI_ALIAS_FLAG否则您的文本看起来会非常清晰。这通常会在较低的API中体现出来。
Martin Marconcini

4
在科特林:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
艾伯特·维拉·卡尔沃

72

在“接受”的答案上面确实工作(当您尝试使用像串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), ...)));

4
<u>在下划线的地方</ u>效果很好。&lt; u>下划线&lt; / u>无效。这是用于Android 2.2。也许不同的版本对它的解释不同。
user898763452

@autotravis是哪个用于2.2?我没有在较旧的版本上进行测试,如果不同版本对它的处理方式不同,这将是非常不幸的。此外,至少当前的文档指出必须将其转义(答案中有链接)。
Ognyan

我已经在android 2.3上测试了<u>带下划线的</ u>,并且可以正常工作。&lt; u>下划线&lt; / 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()。
罗伊·索尔伯格

59

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中的帮助程序编辑UI中编辑字符串资源文件,因为它会转义<s。
克里斯·雷

51

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

非常优雅的解决方案。谢谢!
阿德里安

20

一线解决方案

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

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


18

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

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

用法:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

查看强调的可点击按钮样式:

<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

11

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

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

在此处输入图片说明


10

我知道这是一个较晚的答案,但是我想出了一个效果很好的解决方案...我从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代码段中添加了其他选项,以表明我的示例可以更改文本的颜色,大小和样式。

希望这可以帮助!


2
在此示例正常工作的同时,我很快意识到,如果您想使用XML进行其他控制,那将是行不通的……我转而使用了涉及以下步骤的更好的解决方案:1)子类textview 2)添加支持通过自定义属性在文本上加下划线,以执行上述指定的下划线操作。唯一的区别是,如果设置了custom属性,则仅执行下划线代码。
贾斯汀2014年

10

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

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


7

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

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

7

我使用此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>

这是使用自定义颜色的所有视图下划线的理想解决方案。不要不尊重透明背景,对于android 4是必需的,您的视图将具有黑色背景(不带背景)
Ivan Mitsura

5

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

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

太棒了!! 但是下划线的颜色是灰色,如何将其更改为黑色或任何其他颜色?
OhhhThatVarun

3

我简化了塞缪尔的回答:

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

3

我轻松创建了此方法

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

下划线整个TextView

setUnderLineText(tv, tv.getText().toString());

在TextView的下划线

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


2

试试这个代码

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

祝好运!


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

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

我希望这有帮助。


2

票数最高的答案是正确和最简单的。但是,有时您可能会发现该字体不适用于某些字体,而适用于其他字体。(与中文打交道时遇到的问题)。

解决方法是不要仅对TextView使用“ WRAP_CONTENT”,因为没有多余的空间来绘制线条。您可以将固定高度设置为TextView,或将android:paddingVertical与WRAP_CONTENT一起使用。


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文件中的转义符号


为我使用了逃生符号,谢谢!
Badr

1

在Kotlin中执行以下操作:

yourTextView.paint?.isUnderlineText = true


0

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

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

-2

我在使用自定义字体时遇到问题,使用资源文件技巧(<u>Underlined text</u>)创建的下划线确实起作用,但是Android设法将下划线转换为某种打击槽。

我自己使用以下答案在textview下方绘制边框:https ://stackoverflow.com/a/10732993/664449 。显然,这不适用于部分带下划线的文本或多行文本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.