如何在textview上设置下划线文本?

Posted

技术标签:

【中文标题】如何在textview上设置下划线文本?【英文标题】:How to set underline text on textview? 【发布时间】:2011-08-04 11:38:52 【问题描述】:

如何在textview上设置下划线文字?

我使用了以下代码,但它不起作用。

tvHide.setText(html.fromHtml("<p><u>Hide post</u></p>").toString());

【问题讨论】:

解决这个问题的三种方法***.com/questions/2394935/… Can I underline text in an android layout?的可能重复 这不是这两个问题的重复,因为 OP 要求在 textview 下划线,而不是文本本身。否则,他的问题标题需要更改。换句话说,即使 textview 是空的,它仍然应该有下划线.. 将其视为仅在底部的边框,但始终存在。 5 Amazing Ways To UnderLine A TextView In Android 【参考方案1】:

您必须为此使用SpannableString:

String mystring=new String("Hello.....");
SpannableString content = new SpannableString(mystring);
content.setSpan(new UnderlineSpan(), 0, mystring.length(), 0);
yourtextview.setText(content);

更新:您可以通过所有可能的方式参考我在 Underling TextView 的 here 上的回答。

【讨论】:

只想在此处添加一条注释:在设置跨度时,请确保您没有使用 textAllCaps = true。它不会起作用。 在需要标志时避免给出简单的“0”,在大多数情况下Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 是要走的路。【参考方案2】:

我相信你需要使用CharSequence。你可以找到一个例子here。

【讨论】:

【参考方案3】:

你可以这样做:

tvHide.setText(Html.fromHtml("<p><span style='text-decoration: underline'>Hide post</span></p>").toString());

希望对你有帮助

【讨论】:

【参考方案4】:

你快到了:只是不要在Html.fromHtml() 上调用toString(),你会得到一个可以完成这项工作的跨区对象;)

tvHide.setText(Html.fromHtml("<p><u>Hide post</u></p>"));

【讨论】:

【参考方案5】:

不需要使用HTML属性,我们关注java xD 我有同样的问题,我在java中找到了解决方法:

String text="Hide post";
TextView tvHide=(TextView)findViewById(R.id.text);
SpannableString spanString = new SpannableString(text);
spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
tvHide.setText(spanString );

【讨论】:

【参考方案6】:

使用这个

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

【讨论】:

去掉那个下划线怎么样? 这感觉比 SpannableString 解决方案更简洁。我想知道,设置此绘制标志是否只是表明系统应该处理 SpannableString 设置,还是发生了完全不同的事情? 这不适用于多行的 TextView。至少对我来说。 @PratikButani 禁用:tvHide.setPaintFlags(0);【参考方案7】:

Android 支持使用字符串 xml 中的 HTML 标记进行字符串格式化。所以下面会起作用:

<string name="label_testinghtmltags"><u>This text has an underscore</u></string>

然后你就照常使用它。您可以在文档here 中查看更多信息

更新:

为了进一步扩展答案,documentation 说:

...format(String, Object...)getString(int, Object...) 方法从字符串中删除所有样式信息。 .解决此问题的方法是编写带有转义实体的 HTML 标记,然后在格式化发生后使用 fromHtml(String) 恢复这些标记

例如,以下代码 sn-p 生成的字符串将显示为包含下划线元素:

<string name="html_bold_test">This <u>%1$s</u> has an underscore</string>
String result = getString(R.string.html_bold_test, "text")

但是,以下 sn-p 的结果包含下划线:

<string name="html_bold_test">This &lt;u> %1$s &lt;/u> has an underscore</string>
String result = Html.fromHtml(getString(R.string.html_bold_test, "text"))

【讨论】:

@BariqDharmawan 我用文档中的信息扩展了答案。也许这可以解决您的问题。【参考方案8】:

试试这个,

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

【讨论】:

【参考方案9】:

以下是android中下划线文本的一些方法:

第一种方法

你可以在strings.xml中定义你的字符串

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

并在您的xml 文件中使用该字符串

<TextView
            android:id="@+id/txt_underlined"
            android:layout_
            android:layout_
            android:text="@string/your_string"/>

或者您可以在 Activity/Fragment 中使用该字符串

txtView.setText(R.string.your_string);

第二种方法

要在TextView中给文字加下划线,可以使用SpannableString

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

第三种方法

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

txtView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
txtView.setText("Underlined Text");

第四种方法

利用Html.fromHtml(htmlString);

String htmlString="<u>Underlined Text</u>";
txtView.setText(Html.fromHtml(htmlString));

或者

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

注意:

如果您在布局中添加了这一行 android:textAllCaps="true",那么以上都不起作用。为此,您必须在 Caps 中定义您的字符串,然后使用上述任何一种方法。

【讨论】:

这个问题的最佳和完整答案 谢谢,就我而言,我使用的是 android:textAllCaps="true"。由于哪个下划线不起作用。 改变下划线高度的方法?【参考方案10】:

TextView 中显示下划线的简单方法是:

yourTextView.getPaint().setUnderlineText(true);

如果你想删除那个视图的下划线,你可以写下面的代码:

yourTextView.getPaint().setUnderlineText(false);

即使您设置了android:textAllCaps="true",它也会起作用

【讨论】:

【参考方案11】:

在我的sign_in.xml 文件中,我使用了这个:

<Button
    android:id="@+id/signuptextlinkbtn"
    android:layout_
    android:layout_
    android:layout_marginTop="10dp"
    android:background="@android:color/transparent"
    android:onClick="performSingUpMethod"
    android:text="Sign up now!"
    android:textColor="#5B55FF"
    android:textSize="15dp"
    android:textStyle="bold" />

在我的SignIn.java 文件中,我使用了这个:

import android.graphics.Paint;
Button signuptextlinkbutton = (Button) findViewById(R.id.signuptextlinkbtn);
signuptextlinkbutton.setPaintFlags(signuptextlinkbutton.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG);

现在我可以看到我的链接带有下划线。这只是一个文本,甚至认为我将其声明为Button

【讨论】:

【参考方案12】:

您可以轻松地添加一个高度为 1dp 的视图,对齐起点和终点的 TextView,就在它的正下方。您还可以使用负值的 marginTop 使下划线更接近 TextView。如果您在相对布局中使用 TextView 和 under ,则对齐会容易得多。这是一个例子:

<RelativeLayout
android:layout_
android:layout_>

<View
  android:id="@+id/viewForgotPasswordUnderline"
  android:layout_
  android:layout_
  android:layout_below="@id/txtForgotPassword"
  android:layout_alignStart="@id/txtForgotPassword"
  android:layout_alignEnd="@id/txtForgotPassword"
  android:layout_marginTop="-2dp"
  android:background="@color/lightGray" />

<androidx.appcompat.widget.AppCompatTextView
  android:id="@+id/txtForgotPassword"
  android:layout_
  android:layout_
  android:layout_centerHorizontal="true"
  android:paddingTop="8dp"
  android:text="@string/userLoginForgotPassword"
  android:textColor="@color/lightGray"
  android:textSize="16dp" />
</RelativeLayout>

【讨论】:

【参考方案13】:

Kotlin - 普通代码

val text = getString(R.string.welcome)

val spannableString = SpannableString(text).apply 
    setSpan(UnderlineSpan(), 0, text.length, 0)


text_view.text = spannableString

Kotlin - 扩展

fun TextView.underline(resource: Int) 
    val text = context.getString(resource)
    val spannableString = SpannableString(text).apply 
        setSpan(UnderlineSpan(), 0, text.length, 0)
    

    setText(spannableString)

用法:

text_view.underline(R.string.welcome)

Kotlin - 绑定代码

@BindingAdapter("underline")
fun underline(view: TextView, resource: Int) 
    if (resource == 0) return

    val text = view.context.getString(resource)
    val spannableString = SpannableString(text).apply 
        setSpan(UnderlineSpan(), 0, text.length, 0)
    

    view.text = spannableString

用法:

<TextView
    android:id="@+id/tv_report_problem"
    android:layout_
    android:layout_
    app:underline="@@string/common_report_problem" />

【讨论】:

以上是关于如何在textview上设置下划线文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中删除textview的下划线

如何在android中创建带有下划线文本的Textview [重复]

如何在 Android TextView 中将字体样式设置为粗体、斜体和下划线?

Android TextView中的下划线和更改文本颜色[重复]

android TextView中如何设置下划线

如何在android上实现PDF的下划线,批注功能