在 Android 中的 TextView 下方绘制下划线

Posted

技术标签:

【中文标题】在 Android 中的 TextView 下方绘制下划线【英文标题】:To draw an Underline below the TextView in Android 【发布时间】:2011-12-23 09:58:39 【问题描述】:

我想在我的TextView 下方画下划线。我搜索了一些内容,但没有找到任何成果。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

如果您想在电子邮件地址文本下划线并希望在用户单击该特定电子邮件地址时打开与电子邮件相关的应用程序,那么这是最好的方法。只需使用以下属性。

android:autoLink="email"

同样你也可以做网站

android:autoLink="web"

另外,如果你想设置文本颜色,你可以在属性下面

android:textColorLink="@color/email_text_color"

【讨论】:

【参考方案2】:

Kotlin 中您可以创建扩展属性:

inline var TextView.underline: Boolean
    set(visible) 
        paintFlags = if (visible) paintFlags or Paint.UNDERLINE_TEXT_FLAG
        else paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
    
    get() = paintFlags and Paint.UNDERLINE_TEXT_FLAG == Paint.UNDERLINE_TEXT_FLAG

并使用:

textView.underline = true

【讨论】:

【参考方案3】:

您可以使用 Kotlin 扩展并输入您自己的 drawUnderLine 方法。

fun TextView.drawUnderLine() 
    val text = SpannableString(this.text.toString())
    text.setSpan(UnderlineSpan(), 0, text.length, 0)
    this.text = text

yourTextView.drawUnderLine()

【讨论】:

【参考方案4】:

5 Amazing Ways To Underline A TextView In Android - Kotlin/Java & XML

    String html = "<u>Underline using Html.fromHtml()</u>"; textview.setText(Html.fromHtml(html));

Html.fromHtml(String resource) 在 API 24 中已被弃用。

所以你可以使用最新的android支持库androidx.core.text.HtmlCompat。在此之前,您需要在项目中包含依赖项。

`implementation 'androidx.core:core:1.0.1'`
    String html = "<u> 1.1 Underline using HtmlCompat.fromHtml()</u>"; //underline textview using HtmlCompat.fromHtml() method textview11.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY));

使用 strings.xml

    &lt;string name="underline_text"&gt;1.3 &amp;lt;u&gt;Underline using HtmlCompat.fromHtml() and string resource&amp;lt;/u&gt;&lt;/string&gt;

textview13.setText(HtmlCompat.fromHtml(getString(R.string.underline_text), HtmlCompat.FROM_HTML_MODE_LEGACY));

使用 PaintFlags

    textview2.setPaintFlags(textview2.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); textview2.setText("2. Underline using setPaintFlags()");

使用 SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`

【讨论】:

【参考方案5】:

一个简单且可持续的解决方案是创建一个图层列表并将其作为 TextView 的背景:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

【讨论】:

如果是单行textview这个是最好的选择【参考方案6】:

如果您的 TextView 具有固定宽度,替代解决方案可以是创建一个看起来像下划线的视图并将其放置在您的 TextView 正下方。

<RelativeLayout
   android:layout_
   android:layout_>

        <TextView
            android:id="@+id/myTextView"
            android:layout_
            android:layout_/>

        <View
            android:layout_
            android:layout_
            android:layout_below="@+id/myTextView"
            android:background="#CCCCCC"/>
</RelativeLayout>

【讨论】:

【参考方案7】:

在 TextView 中有三种方式为文本添加下划线。

    SpannableString

    setPaintFlags(); 的 TextView

    Html.fromHtml();

让我向您解释所有方法:

第一种方法

对于 TextView 中的文本,您必须使用 SpannableString

String udata="Underlined Text";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);
mTextView.setText(content);

第二种方法

可以利用TextView的setPaintFlags方法给TextView的文字加下划线。

例如。

mTextView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
mTextView.setText("This text will be underlined");

如果你想穿透文本,你可以参考Paint类的常量。

第三种方法

利用Html.fromHtml(htmlString);

String htmlString="<u>This text will be underlined</u>";
mTextView.setText(Html.fromHtml(htmlString));

txtView.setText(Html.fromHtml("<u>underlined</u> text"));

【讨论】:

很高兴听到这个消息。将此问题标记为已解决,以便其他用户可以参考。 第三种方法是使用Html.fromHtml("&lt;u&gt;This text will be underlined&lt;/u&gt;"),但我不得不承认我更喜欢使用 SpannableStrings。 @Kartik:您不妨在文本上使用StrikethroughSpan 来创建删除线效果。 :) 喜欢第三种方法。短小精悍,只需在我的程序中添加一行代码。 我知道这有点老了,但是有没有办法设置下划线的粗细? 在 PreferenceCategory 中,哪些用于preferenceActivity 内容?【参考方案8】:

对于仍在查看此问题的任何人。这是一个超链接,但您可以将其修改为一个简单的下划线:

创建一个可绘制对象(hyperlink_underline.xml):

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

      <stroke android:
              android:color="#3498db"/>
    </shape>
  </item>
</layer-list>

创建新样式:

<style name="Hyperlink">
    <item name="android:textColor">#3498db</item>
    <item name="android:background">@drawable/hyperlink_underline</item>
  </style>

然后在你的 TextView 上使用这个样式:

<TextView
    android:layout_
    android:layout_
    local:MvxBind="Text Id; Click ShowJobInfoCommand"
    style="@style/HyperLink"/>

【讨论】:

谢谢,这很有用,我学到了一些新东西,还有左上角等属性,我们可以用作上线或侧线。再次感谢【参考方案9】:

只需在你的 string.xml 资源文件中用 标签包围你的文本

<string name="your_string"><u>Underlined text</u></string>

在你的活动/片段中

mTextView.setText(R.string.your_string);

【讨论】:

@CHAKRAVARTHI 如果在设置之前将文本转换为字符串,它将不起作用。例如。 textView.setText(getString(R.string.text)) 对: textView.setText(getText(R.string.text)) 或只是 textView.setText(R.string.text)。原因在于getText() 返回带有下划线跨度的Spannable,但如果您使用getString(),它会将Spannable 转换为String 生成的跨度将被删除。 好点!为了更清楚,我已经编辑了我当前的答案【参考方案10】:

它对我有用。

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

【讨论】:

以上是关于在 Android 中的 TextView 下方绘制下划线的主要内容,如果未能解决你的问题,请参考以下文章

Android:在布局中重绘特定视图

如何为android recyclerview中的最大字符串设置textview高度?

android button和textview并排放 textview换行时怎样在button下方而不是前面空出

在相对布局下的图像按钮下方居中 Textview?

在Android开发中。怎么能让layout中的TextView控件不会根据其它控件的大小而改变位置。

一个文本视图(居中放置)下方的三个文本视图(并排)- Android