【发布时间】:2011-01-24 14:16:16
【问题描述】:
如何在 Android 布局 xml 文件中定义 下划线 文本?
【问题讨论】:
-
这里我用例子描述了最佳实践。看到这个答案link
标签: android android-layout fonts
如何在 Android 布局 xml 文件中定义 下划线 文本?
【问题讨论】:
标签: android android-layout fonts
尝试类
对于java
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
对于科特林
textview.setPaintFlags(textview.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG)
【讨论】:
如果您想在 XML 中实现这一点,请在资源中声明您的字符串并将该资源值放入 HTML 的下划线标记 ()。 在TextView中,添加
android:text="@string/your_text_reference"
而在字符串资源值中,
<string name="your_text_reference"><u>Underline me</u></string>
如果您想以编程方式实现这一点,对于 Kotlin 使用
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
或者,
textView.text = Html.fromHtml("<p><u>Underline me</u></p>")
【讨论】:
非常紧凑,kotlin 版本:
tvTitle.apply {
text = "foobar"
paint?.isUnderlineText = true
}
【讨论】:
TextView tv = findViewById(R.id.tv);
tv.setText("some text");
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 的多个部分下划线?
【讨论】:
在 Kotlin 中做到这一点:
yourTextView.paint?.isUnderlineText = true
【讨论】:
回答这个问题已经很晚了,但是假设如果有人想动态获取文本,那么他们可以在他们的 java 代码中使用这个简单的一行代码:
textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));
【讨论】:
上面的“接受”答案NOT起作用(当您尝试使用textView.setText(Html.fromHtml(String.format(getString(...), ...)))之类的字符串时。
如documentations 中所述,您必须使用&lt; 转义(html 实体编码的)内部标签的左括号,例如结果应如下所示:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
然后在你的代码中你可以设置文本:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
【讨论】:
对于 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);
【讨论】:
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
注意 xml 文件中的转义符号
【讨论】:
票数最高的答案是正确且最简单的。但是,有时您可能会发现不适用于某些字体,而适用于其他字体。(我在处理中文时遇到了这个问题。)
解决方案是不要只为您的 TextView 使用“WRAP_CONTENT”,因为没有额外的空间来绘制线条。您可以为 TextView 设置固定高度,或使用 android:paddingVertical 和 WRAP_CONTENT。
【讨论】:
另一种解决方案是创建一个扩展 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"
/>
【讨论】:
在 Kotlin 中可以使用扩展函数。这只能在代码中使用,不能在 xml 中使用。
fun TextView.underline() {
paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
用法:
tv_change_number.underline()
tv_resend_otp.underline()
【讨论】:
sampleTextView.setText(R.string.sample_string);
此外,以下代码不会打印下划线:
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
我希望这会有所帮助。
【讨论】:
我使用这个 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>
【讨论】:
我简化了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>
【讨论】:
一种更清洁的方式,而不是 textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
方法是使用
textView.getPaint().setUnderlineText(true);
如果您以后需要关闭该视图的下划线,例如在 RecyclerView 中的重用视图中,textView.getPaint().setUnderlineText(false);
【讨论】:
只需使用字符串资源文件中的属性,例如
<string name="example"><u>Example</u></string>
【讨论】:
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"
/>
【讨论】:
如果您使用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);
【讨论】:
<u> 标记不起作用的情况,例如有时,如果您使用的是自定义字体。但是,UnderlineSpan 以编程方式进行的底层对我来说还没有失败,所以我会推荐它作为最可靠的解决方案。
查看下划线的可点击按钮样式:
<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>
结果:
【讨论】:
简单灵活的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" />
【讨论】:
myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));
有点晚了,但可能对某人有用。
【讨论】:
试试这个代码
在 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)));
祝你好运!
【讨论】:
我知道这是一个迟到的答案,但我想出了一个效果很好的解决方案......我从 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 sn-p 中添加了其他选项,以表明我的示例适用于更改文本颜色、大小和样式...
希望这会有所帮助!
【讨论】:
我在使用自定义字体时遇到问题,并且使用资源文件技巧 (<u>Underlined text</u>) 创建的下划线确实有效,但 Android 设法将下划线转换为某种打击槽。
我自己使用这个答案在 textview 下方画了一个边框:https://stackoverflow.com/a/10732993/664449。显然,这不适用于部分下划线文本或多线文本。
【讨论】:
你可以试试
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
【讨论】:
| Paint.ANTI_ALIAS_FLAG,否则您的文字看起来会非常清晰。这通常体现在较低的 API 中。
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG