我可以在Android布局中为文本加下划线吗?
如何在Android布局我可以在Android布局中为文本加下划线吗?,android,android-layout,fonts,Android,Android Layout,Fonts,如何在Android布局xml文件中定义带下划线的文本?如果您使用的是支持HTML标记的xml文件,如、和,则可以实现此功能 上面的“已接受”答案不起作用(当您尝试使用类似textView.setText(Html.fromHtml(string.format(getString(…),…)))的字符串时) 如中所述,必须用转义(html实体编码)内部标记的左括号,例如,结果应如下所示: <resource> <string name="your_string_here
xml
文件中定义带下划线的文本?如果您使用的是支持HTML标记的xml文件,如
、
和
,则可以实现此功能
上面的“已接受”答案不起作用(当您尝试使用类似textView.setText(Html.fromHtml(string.format(getString(…),…)))
的字符串时)
如中所述,必须用
转义(html实体编码)内部标记的左括号,例如,结果应如下所示:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
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"
/>
您可以尝试使用
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
我在使用自定义字体时遇到了一个问题,使用资源文件技巧创建的下划线(
带下划线的文本
)确实有效,但Android成功地将下划线转换为一种删除槽
我自己用这个答案在textview下面画了一个边框:。显然,这对带下划线的部分文本或多行文本不起作用。我知道这是一个迟来的答案,但我想出了一个非常好的解决方案……我从Anthony Forloney那里得到了在代码中为文本加下划线的答案,并创建了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中创建带下划线的textview,只需执行以下操作:
<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片段中添加了其他选项,以显示我的示例可以更改文本颜色、大小和样式
希望这有帮助!试试这段代码
在XML中
<resource>
<string name="my_text"><![CDATA[This is an <u>underline</u>]]></string>
</resources>
祝你好运!单线解决方案
myTextView.setText(Html.fromHtml(“我是带下划线的文本””);
虽然有点晚,但可能对某些人有用。对于按钮和文本视图,这是最简单的方法: 按钮:
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);
Romain Guy on介绍了绘制带下划线文本的最新方法,并在上提供了源代码。 此示例应用程序公开了两种可能的实现:
- 需要API级别19的基于路径的实现
- 需要API级别1的基于区域的实现
我使用此xml可绘制文件创建底部边框,并将可绘制文件作为背景应用于我的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>
一个简单灵活的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" />
查看带下划线的可点击按钮样式:
<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>
添加新联系人
结果:
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文档
请参阅文档:
我希望这会有所帮助。只需使用字符串资源文件中的属性即可
<string name="example"><u>Example</u></string>
示例
一种更干净的方式,而不是textView.setPaintFlags(textView.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG);
方法是使用
textView.getPaint().setUnderlineText(true);
如果以后需要关闭该视图的下划线,例如在RecyclerView中的重用视图中,textView.getPaint().setUnderlineText(false);
我的答案是:
<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>
最简单的方法
还支持文本视图孩子,如编辑文本、按钮、复选框
public void setUnderLineText(TextView tv,String textToUnderLine){
字符串tvt=tv.getText().toString();
intofe=tvt.indexOf(textToUnderLine,0);
UnderlineSpan UnderlineSpan=新的UnderlineSpan();
SpannableString wordToSpan=新的SpannableString(tv.getText());
对于(intofs=0;ofs
如果你愿意
-可单击下划线文本?
-在TextView的多个部分加下划线?
然后可以使用Kotlin扩展函数中的。这只能从代码中使用,不能从xml中使用
fun TextView.underline() {
paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
用法:
tv_change_number.underline()
tv_resend_otp.underline()
另一个解决方案是创建一个自定义视图来扩展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);
}
}
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
只需添加到xml,如下所示
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);
}
}
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
得票最多的答案是正确且简单的。然而,有时你可能会发现,这并不适用于某些字体,而是适用于其他字体。(我在处理中文时遇到了这个问题。) 解决方案是不要只在文本视图中使用“WRAP\u CONTENT”,因为没有多余的空间来画线。您可以为文本视图设置固定高度,或者使用android:padding vertical和WRAP\u CONTENT。
HtmlCompat.fromHtml(
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>
format(context.getString(R.String.set_target_,带下划线)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
u> 设置Targetu>
请注意xml文件中的转义符号回答这个问题已经很晚了,但是假设有
fun TextView.underline() {
paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
tv_change_number.underline()
tv_resend_otp.underline()
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);
}
}
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
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>
textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));
tvTitle.apply {
text = "foobar"
paint?.isUnderlineText = true
}
android:text="@string/your_text_reference"
<string name="your_text_reference"><u>Underline me</u></string>
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
textView.text = Html.fromHtml("<p><u>Underline me</u></p>")