我可以在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

如何在Android布局
xml
文件中定义带下划线的文本?

如果您使用的是支持HTML标记的xml文件,如
,则可以实现此功能

上面的“已接受”答案不起作用(当您尝试使用类似
textView.setText(Html.fromHtml(string.format(getString(…),…)))
的字符串时)

如中所述,必须用
转义(html实体编码)内部标记的左括号,例如,结果应如下所示:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</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>
添加新联系人
结果:

  • 转到strings.xml资源文件
  • 必要时,在资源文件中添加带有HTML下划线标记的字符串
  • 在Java代码中调用字符串资源ID,如下所示:
  • 输出应带有“Stackoverflow”一词的下划线
  • 此外,以下代码不会打印下划线:

    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">&lt;u>Set Target&lt;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">&lt;u>Set Target&lt;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>")