如何在Android布局 xml 文件中定义带下划线的文本?
xml
对于Button和TextView,这是最简单的方法:
按钮:
button = (Button) view.findViewById(R.id.btton1); button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
TextView的:
textView = (Textview) view.findViewById(R.id.textview1); textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
一个更干净的方式而不是textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 方法是使用 textView.getPaint().setUnderlineText(true);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
textView.getPaint().setUnderlineText(true);
如果您需要稍后关闭该视图的下划线,例如在RecyclerView中的重用视图中, textView.getPaint().setUnderlineText(false);
textView.getPaint().setUnderlineText(false);
我有一个问题,我使用自定义字体和资源文件技巧( <u>Underlined text</u> )创建的下划线确实有效,但Android设法将下划线转换为一种打击低谷 .
<u>Underlined text</u>
我用这个答案自己在textview下画一个边框:https://stackoverflow.com/a/10732993/664449 . 显然,这不适用于部分带下划线的文本或多行文本 .
在Kotlin中可以使用扩展功能 . 这只能用于代码,而不能用于xml .
fun TextView.underline() { paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG }
用法:
tv_change_number.underline() tv_resend_otp.underline()
你可以试试
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
只需在字符串资源文件中使用该属性即
<string name="example"><u>Example</u></string>
Strings.xml文件内容:
<resource> <string name="my_text">This is an <u>underline</u>.</string> </resources>
布局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" />
另一个解决方案是创建一个扩展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" />
myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));
它有点晚,但可能对某人有用 .
一个简单而灵活的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" />
Romain Guy在medium上描述了绘制带下划线的文本的最新方法,并在GitHub上提供了可用的源代码 . 此示例应用程序公开了两种可能的实现:
基于路径的实现,需要API级别19
基于区域的实现,需要API级别1
转到strings.xml资源文件
在必要时在资源文件中添加带有HTML下划线标记的字符串 .
strings.xml HTML下划线示例
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);
"You can use either getString(int) or getText(int) to retrieve a string. getText(int) retains any rich text styling applied to the string." Android文档 .
请参阅文档:https://developer.android.com/guide/topics/resources/string-resource.html
我希望这有帮助 .
如果您使用string resource xml文件,它可以实现,该文件支持 <b></b> , <i></i> 和 <u></u> 等HTML标记 .
<b></b>
<i></i>
<u></u>
<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);
我知道这是一个迟到的答案,但我提出了一个非常好的解决方案......我从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代码段中添加了其他选项,以显示我的示例适用于更改文本颜色,大小和样式...
希望这可以帮助!
我简化了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>
上面的"accepted"答案确实 NOT 工作(当你尝试使用像 textView.setText(Html.fromHtml(String.format(getString(...), ...))) 这样的字符串时 .
textView.setText(Html.fromHtml(String.format(getString(...), ...)))
如documentations中所述,您必须使用 < 转义(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), ...)));
我使用这个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>
一线解决方案:
查看下划线的可点击按钮样式:
<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中
<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)));
祝好运!
TextView tv = findViewById(R.id.tv); tv.setText("some text");
Underline whole TextView
setUnderLineText(tv, tv.getText().toString());
Underline some part of 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
21 回答
对于Button和TextView,这是最简单的方法:
按钮:
TextView的:
一个更干净的方式而不是
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
方法是使用textView.getPaint().setUnderlineText(true);
如果您需要稍后关闭该视图的下划线,例如在RecyclerView中的重用视图中,
textView.getPaint().setUnderlineText(false);
我有一个问题,我使用自定义字体和资源文件技巧(
<u>Underlined text</u>
)创建的下划线确实有效,但Android设法将下划线转换为一种打击低谷 .我用这个答案自己在textview下画一个边框:https://stackoverflow.com/a/10732993/664449 . 显然,这不适用于部分带下划线的文本或多行文本 .
在Kotlin中可以使用扩展功能 . 这只能用于代码,而不能用于xml .
用法:
你可以试试
只需在字符串资源文件中使用该属性即
Strings.xml文件内容:
布局xml文件shold使用上面的字符串资源和textview的下面属性,如下所示:
另一个解决方案是创建一个扩展TextView的自定义视图,如下所示
并添加到xml,如下所示
一线解决方案
myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));
它有点晚,但可能对某人有用 .
一个简单而灵活的xml解决方案:
Romain Guy在medium上描述了绘制带下划线的文本的最新方法,并在GitHub上提供了可用的源代码 . 此示例应用程序公开了两种可能的实现:
基于路径的实现,需要API级别19
基于区域的实现,需要API级别1
转到strings.xml资源文件
在必要时在资源文件中添加带有HTML下划线标记的字符串 .
此外,以下代码不会打印下划线:
而是,使用以下代码来保留富文本格式:
"You can use either getString(int) or getText(int) to retrieve a string. getText(int) retains any rich text styling applied to the string." Android文档 .
请参阅文档:https://developer.android.com/guide/topics/resources/string-resource.html
我希望这有帮助 .
如果您使用string resource xml文件,它可以实现,该文件支持
<b></b>
,<i></i>
和<u></u>
等HTML标记 .如果你想用代码使用下划线:
我知道这是一个迟到的答案,但我提出了一个非常好的解决方案......我从Anthony Forloney那里得到了答案,用于在代码中标记文本,并创建了一个TextView的子类来处理这个问题 . 然后,只要您想要带下划线的TextView,就可以在XML中使用子类 .
这是我创建的类:
现在......只要您想在XML中创建带下划线的文本视图,就可以执行以下操作:
我在此XML代码段中添加了其他选项,以显示我的示例适用于更改文本颜色,大小和样式...
希望这可以帮助!
我简化了Samuel的回答:
上面的"accepted"答案确实 NOT 工作(当你尝试使用像
textView.setText(Html.fromHtml(String.format(getString(...), ...)))
这样的字符串时 .如documentations中所述,您必须使用
<
转义(html实体编码)内部标记的左括号,例如结果应该是这样的:然后在您的代码中,您可以设置文本:
我使用这个xml drawable来创建一个底部边框,并将drawable作为背景应用到我的textview
一线解决方案:
查看下划线的可点击按钮样式:
strings.xml:
结果:
试试这段代码
在XML中
在代码中
祝好运!
该死的,它最简单易用
Underline whole TextView
Underline some part of TextView
check my answer here to make clickable underline text or underline multiple parts of TextView