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

Jan*_*usz 642 fonts android android-layout

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

Ant*_*ney 1088

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

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

如果你想用代码使用下划线:

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

  • 嗨,我尝试了上面的资源xml代码,它没有工作.它继续显示<u>下划线</ u>作为纯文本 (46认同)
  • 它不会在编辑器中显示,但是当你启动你的应用程序时 - 它将加下划线. (25认同)
  • 另请参见:android.text.Html.fromHtml(),它返回一个Spanned. (4认同)
  • 您应该在strings.xml文件中键入它,而不是通过添加按钮来键入它.否则你会得到这个&lt; u&gt; 在您的strings.xml文件中,并在代码中用<u>下划线</ u> (3认同)
  • 我遇到了通过`<u>`标签不起作用的情况,例如有时如果你使用自定义字体.但是,"UnderlineSpan"以编程方式进行的基础还没有失败,所以我推荐它作为最可靠的解决方案. (3认同)

小智 512

你可以试试

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

  • 如果要清除它,请使用[此解决方案](http://stackoverflow.com/a/6796829/779408) (4认同)
  • 也许是一个小问题,但 OP 希望在 XML 布局文件中定义它;否则,这是一个很好的解决方案。 (3认同)
  • 在Kotlin中:`textView.paintFlags = textView.paintFlags或Paint.UNDERLINE_TEXT_FLAG` (3认同)
  • 这个解决方案也可以用于Button (2认同)
  • 如果使用自定义字体或类似字体,请务必小心,以及Paint.ANTI_ALIAS_FLAG`或您的文字看起来会非常清晰。这通常会在较低的API中体现出来。 (2认同)

Ogn*_*yan 66

在"接受"回答上面确实工作(当您尝试使用像串textView.setText(Html.fromHtml(String.format(getString(...), ...))).

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

<resource>
    <string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,您可以设置文本:

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

  • <u>这里强调</ u>完美无缺.&lt; u>下划线&lt;/u>不起作用.这适用于Android 2.2.也许不同版本对它的解释不同. (4认同)

小智 54

Strings.xml文件内容:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 
Run Code Online (Sandbox Code Playgroud)

布局xml文件shold使用上面的字符串资源以及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"
    />
Run Code Online (Sandbox Code Playgroud)

  • 确保编辑实际XML中的字符串资源文件,而不是在Eclipse中的帮助程序编辑UI内部,它将转义<s. (3认同)

aws*_*man 42

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

按钮:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

TextView的:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)


gpr*_*our 17

一线解决方案

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

它有点晚,但可能对某人有用.


Re'*_*'em 16

要在 Kotlin 中做到这一点:

yourTextView.paint?.isUnderlineText = true


Ahs*_*sel 15

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

android:text="@string/your_text_reference"
Run Code Online (Sandbox Code Playgroud)

在字符串资源值中,

<string name="your_text_reference"><u>Underline me</u></string>
Run Code Online (Sandbox Code Playgroud)

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

textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Run Code Online (Sandbox Code Playgroud)

或者,

textView.text = Html.fromHtml("<p><u>Underline me</u></p>")
Run Code Online (Sandbox Code Playgroud)


Vol*_*myr 11

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

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

在此输入图像描述


Kil*_*ler 11

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

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
Run Code Online (Sandbox Code Playgroud)

用法:

 tv_change_number.underline()
 tv_resend_otp.underline()
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在......只要您想在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"/>
Run Code Online (Sandbox Code Playgroud)

我在此XML代码段中添加了其他选项,以显示我的示例适用于更改文本颜色,大小和样式...

希望这可以帮助!

  • 虽然这个例子有效,但我很快意识到,如果你想要在XML中有额外的控制权,那就不行了......我已经切换到一个更好的解决方案,涉及以下步骤:1)子类textview 2)添加支持通过自定义属性为文本加下划线,以执行上面指定的下划线.唯一的区别是,如果设置了自定义属性,则只执行下划线代码. (2认同)

Kir*_*ilo 9

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

<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" />
Run Code Online (Sandbox Code Playgroud)

strings.xml中:

<string name="btn_add_contact"><u>Add new contact</u></string>
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述


jk7*_*jk7 8

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

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


Khe*_*raj 7

最简单的方法

TextView tv = findViewById(R.id.tv);
tv.setText("some text");
setUnderLineText(tv, "some");
Run Code Online (Sandbox Code Playgroud)

还支持 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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果你想

- 可点击的下划线文字?

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

然后检查这个答案


has*_*s19 7

另一个解决方案是创建一个扩展 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

并添加到 xml 中,如下所示

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />
Run Code Online (Sandbox Code Playgroud)


Mar*_*hat 7

尝试使用类

对于java

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

对于科特林

textview.setPaintFlags(textview.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG)
Run Code Online (Sandbox Code Playgroud)


use*_*340 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" />
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用此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>
Run Code Online (Sandbox Code Playgroud)


Hei*_*erg 5

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

<string name="example"><u>Example</u></string>
Run Code Online (Sandbox Code Playgroud)


Dar*_*ush 5

我简化了Samuel的回答:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--/sf/answers/2849426891/>
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)


Mak*_*ele 5

非常紧凑,kotlin 版本:

tvTitle.apply { 
    text = "foobar"
    paint?.isUnderlineText = true
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

474339 次

最近记录:

5 年,11 月 前