首页 文章

我可以在Android布局中为文本加下划线吗?

提问于
浏览
566

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

21 回答

  • 967

    对于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);
    
  • 3

    一个更干净的方式而不是
    textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 方法是使用 textView.getPaint().setUnderlineText(true);

    如果您需要稍后关闭该视图的下划线,例如在RecyclerView中的重用视图中, textView.getPaint().setUnderlineText(false);

  • -2

    我有一个问题,我使用自定义字体和资源文件技巧( <u>Underlined text</u> )创建的下划线确实有效,但Android设法将下划线转换为一种打击低谷 .

    我用这个答案自己在textview下画一个边框:https://stackoverflow.com/a/10732993/664449 . 显然,这不适用于部分带下划线的文本或多行文本 .

  • 17

    在Kotlin中可以使用扩展功能 . 这只能用于代码,而不能用于xml .

    fun TextView.underline() {
        paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
    }
    

    用法:

    tv_change_number.underline()
     tv_resend_otp.underline()
    
  • 53

    你可以试试

    textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
    
  • 7

    只需在字符串资源文件中使用该属性即

    <string name="example"><u>Example</u></string>
    
  • 9

    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"
        />
    
  • 2

    另一个解决方案是创建一个扩展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"
     />
    
  • 1

    一线解决方案

    myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

    它有点晚,但可能对某人有用 .

  • 2

    一个简单而灵活的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" />
    
  • 61

    Romain Guy在medium上描述了绘制带下划线的文本的最新方法,并在GitHub上提供了可用的源代码 . 此示例应用程序公开了两种可能的实现:

    • 基于路径的实现,需要API级别19

    • 基于区域的实现,需要API级别1

  • 4
    • 转到strings.xml资源文件

    • 在必要时在资源文件中添加带有HTML下划线标记的字符串 .

    strings.xml HTML下划线示例

    • 在Java代码中调用字符串资源ID,如下所示:

    sampleTextView.setText(R.string.sample_string);

    • 输出应该带有"Stackoverflow"加下划线 .

    此外,以下代码不会打印下划线:

    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

    我希望这有帮助 .

  • 2

    如果您使用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);
    
  • 1

    我知道这是一个迟到的答案,但我提出了一个非常好的解决方案......我从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代码段中添加了其他选项,以显示我的示例适用于更改文本颜色,大小和样式...

    希望这可以帮助!

  • 2

    我简化了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>
    
  • 0

    上面的"accepted"答案确实 NOT 工作(当你尝试使用像 textView.setText(Html.fromHtml(String.format(getString(...), ...))) 这样的字符串时 .

    documentations中所述,您必须使用 &lt; 转义(html实体编码)内部标记的左括号,例如结果应该是这样的:

    <resource>
        <string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>
    </resources>
    

    然后在您的代码中,您可以设置文本:

    TextView textView = (TextView) view.findViewById(R.id.textview);
    textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
    
  • 7

    我使用这个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>
    
  • 460

    一线解决方案:

    textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
    
  • 3

    查看下划线的可点击按钮样式:

    <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>
    

    结果:

  • 45

    试试这段代码

    在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)));
    

    祝好运!

  • 30

    该死的,它最简单易用

    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

相关问题