本文共 6891 字,大约阅读时间需要 22 分钟。
如何在Android布局xml
文件中定义带下划线的文本?
Strings.xml文件内容:
This is an underline.
布局xml文件存储区将上述字符串资源与textview的以下属性一起使用,如下所示:
您可以尝试
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
我在使用自定义字体时遇到了问题,使用资源文件技巧( <u>Underlined text</u>
)创建的<u>Underlined text</u>
确实可以正常工作,但是Android设法将下划线转换为某种罢工槽。
我自己使用以下答案在textview下方绘制边框: ://stackoverflow.com/a/10732993/664449。 显然,这不适用于部分带下划线的文本或多行文本。
我知道这是一个较晚的答案,但是我想出了一个效果很好的解决方案...我从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创建带下划线的textview时,只需执行以下操作:
我在此XML代码段中添加了其他选项,以表明我的示例可以更改文本的颜色,大小和样式。
希望这可以帮助!
如果使用的 xml文件支持HTML标签,如<b></b>
, <i></i>
和<u></u>
。
This is an underline.
如果要在代码中加下划线,请使用:
TextView textView = (TextView) view.findViewById(R.id.textview);SpannableString content = new SpannableString("Content");content.setSpan(new UnderlineSpan(), 0, content.length(), 0);textView.setText(content);
试试这个代码
在XML中
underline]]>
在代码中
TextView textView = (TextView) view.findViewById(R.id.textview);textView.setText(Html.fromHtml(getString(R.string.my_text)));
祝好运!
myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));
时间有点晚,但对某人可能有用。
对于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);
Romain Guy在上描述了绘制带下划线的文本的最新方法,并在提供了源代码。 此示例应用程序公开了两种可能的实现:
我使用此xml drawable创建底边框,并将该drawable作为背景应用于我的textview
xml中的一种简单而灵活的解决方案:
查看强调的可点击按钮样式:
strings.xml:
Add new contact
结果:
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文档。
请参阅文档: :
我希望这有帮助。
只需在字符串资源文件中使用属性,例如
Example
一种更清洁的方式,而不是
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
方法是使用textView.getPaint().setUnderlineText(true);
而且,如果您以后需要关闭该视图的下划线,例如在RecyclerView的重用视图中,则textView.getPaint().setUnderlineText(false);
我简化了的回答:
TextView tv = findViewById(R.id.tv);tv.setText("some text");
下划线整个TextView
setUnderLineText(tv, tv.getText().toString());
在TextView的下划线
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); } } }
在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); }}
并添加到xml,如下所示
票数最高的答案是正确和最简单的。 但是,有时您可能会发现该字体不适用于某些字体,而适用于其他字体。(这是我在处理中文时遇到的一个问题。)
解决方法是不要仅对TextView使用“ WRAP_CONTENT”,因为没有多余的空间来绘制线条。 您可以将固定高度设置为TextView,或将android:paddingVertical与WRAP_CONTENT一起使用。
HtmlCompat.fromHtml( String.format(context.getString(R.string.set_target_with_underline)), HtmlCompat.FROM_HTML_MODE_LEGACY)<u>Set Target<u>
注意xml文件中的转义符号
在“接受”的答案以上不工作(当您尝试使用像串textView.setText(Html.fromHtml(String.format(getString(...), ...)))
如中所述,您必须使用<
转义(标记为html实体的html)内部标签的右括号<
,例如结果应如下所示:
This is an <u>underline</u>.
然后,可以在代码中设置以下内容:
TextView textView = (TextView) view.findViewById(R.id.textview);textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
转载地址:http://hvdnb.baihongyu.com/