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

时间:2010-03-07 02:26:35

标签: android android-layout fonts

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

27 个答案:

答案 0 :(得分:1032)

如果您使用string resource xml文件,可以实现此功能,该文件支持<b></b><i></i><u></u>等HTML标记。

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

答案 1 :(得分:483)

您可以尝试使用

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

答案 2 :(得分:62)

上面的“已接受”答案 NOT 有效(当您尝试使用textView.setText(Html.fromHtml(String.format(getString(...), ...)))这样的字符串时。

documentations中所述,您必须使用&lt;转义内部代码的开头括号(html实体编码),例如结果应该如下:

<resource>
    <string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>
</resources>

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

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

答案 3 :(得分:58)

一线解决方案:

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

答案 4 :(得分:49)

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

答案 5 :(得分:34)

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

按钮:

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

Textview:

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

答案 6 :(得分:17)

一线解决方案

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

有点迟了但对某人有用。

答案 7 :(得分:10)

要在Kotlin中做到这一点:

yourTextView.paint?.isUnderlineText = true

答案 8 :(得分:9)

我知道这是一个迟到的答案,但我提出了一个非常好的解决方案......我从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中创建带下划线的文本视图,就可以执行以下操作:

<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代码段中添加了其他选项,以显示我的示例适用于更改文本颜色,大小和样式......

希望这有帮助!

答案 9 :(得分:9)

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

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

enter image description here

答案 10 :(得分:7)

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

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

结果:

enter image description here

答案 11 :(得分:7)

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

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

用法:

 tv_change_number.underline()
 tv_resend_otp.underline()

答案 12 :(得分:7)

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

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

答案 13 :(得分:4)

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

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

答案 14 :(得分:3)

该死的,使用起来最简单

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

为整个TextView加下划线

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

为TextView的某些部分加下划线

setUnderLineText(tv, "some");
  

还支持EditView子项,如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);
            }
        }
    }

check my answer here to make clickable underline text or underline multiple parts of TextView

答案 15 :(得分:2)

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

byte[] bin = FileUpload1.FileBytes;

答案 16 :(得分:2)

  1. 转到strings.xml资源文件
  2. 在资源文件中添加一个字符串,并在必要时添加HTML下划线标记。
  3.   

    strings.xml HTML underline sample

    1. 在Java代码中调用字符串资源ID,如下所示:
    2. sampleTextView.setText(R.string.sample_string);
      
      1. 输出应该有&#34; Stackoverflow&#34;下划线。
      2. 此外,以下代码不会打印下划线:

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

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

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

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

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

        我希望这会有所帮助。

答案 17 :(得分:2)

我使用这个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>

答案 18 :(得分: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)));

祝你好运!

答案 19 :(得分:1)

我简化了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>

答案 20 :(得分:1)

另一种解决方案是创建一个扩展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"
 />

答案 21 :(得分:1)

非常紧凑的Kotlin版本:

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

答案 22 :(得分:1)

如果要在 XML 中实现此目的,请在资源中声明字符串,然后将该资源值放入HTML的下划线标记( )中。 在TextView中,添加

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

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

答案 26 :(得分:-2)

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

我用这个答案自己在textview下面画一个边框:https://stackoverflow.com/a/10732993/664449。显然,这不适用于部分带下划线的文本或多行文字。