【问题标题】:Can I underline text in an Android layout?我可以在 Android 布局中为文本添加下划线吗?
【发布时间】:2011-01-24 14:16:16
【问题描述】:

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

【问题讨论】:

  • 这里我用例子描述了最佳实践。看到这个答案link

标签: android android-layout fonts


【解决方案1】:

尝试类

对于java

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

对于科特林

textview.setPaintFlags(textview.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG)

【讨论】:

    【解决方案2】:

    如果您想在 XML 中实现这一点,请在资源中声明您的字符串并将该资源值放入 HTML 的下划线标记 ()。 在TextView中,添加

    android:text="@string/your_text_reference"
    

    而在字符串资源值中,

    <string name="your_text_reference"><u>Underline me</u></string>
    

    如果您想以编程方式实现这一点,对于 Kotlin 使用

    textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
    

    或者,

    textView.text = Html.fromHtml("<p><u>Underline me</u></p>")
    

    【讨论】:

      【解决方案3】:

      非常紧凑,kotlin 版本:

      tvTitle.apply { 
          text = "foobar"
          paint?.isUnderlineText = true
      }
      

      【讨论】:

      • 这个答案与 4 月 5 日发布的 answer 有何不同?
      【解决方案4】:

      最简单的方法

      TextView tv = findViewById(R.id.tv);
      tv.setText("some text");
      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);
                  }
              }
          }
      

      如果你愿意

      - 可点击的下划线文字?

      - 在 TextView 的多个部分下划线?

      然后Check This Answer

      【讨论】:

        【解决方案5】:

        在 Kotlin 中做到这一点:

        yourTextView.paint?.isUnderlineText = true

        【讨论】:

          【解决方案6】:

          回答这个问题已经很晚了,但是假设如果有人想动态获取文本,那么他们可以在他们的 java 代码中使用这个简单的一行代码:

           textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));
          

          【讨论】:

            【解决方案7】:

            上面的“接受”答案NOT起作用(当您尝试使用textView.setText(Html.fromHtml(String.format(getString(...), ...)))之类的字符串时。

            documentations 中所述,您必须使用&amp;lt; 转义(html 实体编码的)内部标签的左括号,例如结果应如下所示:

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

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

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

            【讨论】:

            • 加下划线完美运行。 <u>下划线</u>不起作用。这适用于 Android 2.2。也许不同的版本会有不同的解释。
            • @autotravis 哪个适用于 2.2?我没有在旧版本上对其进行测试,如果不同的版本以不同的方式处理它,那将是非常不幸的......而且至少当前的文档指出它必须被转义(链接在答案中)。
            • 我已经在 android 2.3 上测试了 underlined 并且它可以工作。 <u>下划线</u> 不适用于 2.3。文档说“有时您可能想要创建一个样式化的文本资源,该资源也用作格式字符串。通常,这不起作用,因为 String.format(String, Object...) 方法将删除所有样式信息从字符串。解决方法是编写带有转义实体的 HTML 标记,然后在格式化发生后使用 fromHtml(String) 恢复。所以我想如果你通过 String.format(...) 方法运行它,你会使用转义。
            • @autotravis 是的,你是对的。我将它与 String.format(...) 一起使用。我已经编辑了我的答案,感谢您的反馈。
            • 在 2.3 和 4.1(目前只有我尝试过的)你可以只使用 textView.setText(getText(R.string.text)) 而不必使用 getString(), Html.fromHtml( ) 和 String.format()。
            【解决方案8】:

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

            【讨论】:

              【解决方案9】:
              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>
              

              注意 xml 文件中的转义符号

              【讨论】:

                【解决方案10】:

                票数最高的答案是正确且最简单的。但是,有时您可能会发现不适用于某些字体,而适用于其他字体。(我在处理中文时遇到了这个问题。)

                解决方案是不要只为您的 TextView 使用“WRAP_CONTENT”,因为没有额外的空间来绘制线条。您可以为 TextView 设置固定高度,或使用 android:paddingVertical 和 WRAP_CONTENT。

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                  • 太棒了!但是下划线的颜色是灰色的怎么改成黑色或者其他颜色呢?
                  【解决方案12】:

                  在 Kotlin 中可以使用扩展函数。这只能在代码中使用,不能在 xml 中使用。

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

                  用法:

                   tv_change_number.underline()
                   tv_resend_otp.underline()
                  

                  【讨论】:

                    【解决方案13】:
                    1. 转到 strings.xml 资源文件
                    2. 必要时在资源文件中添加带有 HTML 下划线标记的字符串。

                    strings.xml HTML underline sample

                    1. 在Java代码中调用字符串资源ID如下:
                    sampleTextView.setText(R.string.sample_string);
                    
                    1. 输出中的“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 文档。

                    参考文档:https://developer.android.com/guide/topics/resources/string-resource.html

                    我希望这会有所帮助。

                    【讨论】:

                      【解决方案14】:

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

                      • 需要 API 级别 19 的基于路径的实现
                      • 需要 API 级别 1 的基于区域的实现

                      【讨论】:

                        【解决方案15】:

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

                        【讨论】:

                        • 这是所有带有自定义颜色的视图下划线的完美解决方案。不要不尊重这里的透明背景,对于 android 4 是必需的,您的视图将有黑色背景而没有它
                        【解决方案16】:

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

                        【讨论】:

                          【解决方案17】:

                          一种更清洁的方式,而不是
                          textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 方法是使用 textView.getPaint().setUnderlineText(true);

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

                          【讨论】:

                            【解决方案18】:

                            只需使用字符串资源文件中的属性,例如

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

                            【讨论】:

                              【解决方案19】:

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

                              【讨论】:

                              • 确保您在实际 XML 中而不是在 Eclipse 中的帮助程序编辑 UI 中编辑字符串资源文件,因为它会转义
                              【解决方案20】:

                              如果您使用string resource xml 文件可以实现,该文件支持&lt;b&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;u&gt;&lt;/u&gt; 等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);
                              

                              【讨论】:

                              • 嗨,我尝试了上面的资源 xml 代码,但它没有工作。它继续将 下划线 显示为纯文本
                              • 另见:android.text.Html.fromHtml(),它返回一个 Spanned。
                              • 您应该在 strings.xml 文件本身中键入它,而不是通过添加按钮来执行。否则你会得到这个 <u>在您的 strings.xml 文件中和代码中的 下划线
                              • 我遇到过通过&lt;u&gt; 标记不起作用的情况,例如有时,如果您使用的是自定义字体。但是,UnderlineSpan 以编程方式进行的底层对我来说还没有失败,所以我会推荐它作为最可靠的解决方案。
                              • 它不会显示在编辑器中,但是当你启动你的应用程序时 - 它会带下划线。
                              【解决方案21】:

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

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

                              结果:

                              【讨论】:

                              • Widget.AppCompat.Button.Borderless.Colored 的外观和感觉比下划线要好得多,但是,正如@Kiril Vashilo 所述,无论如何您都可以这样做。
                              • 为此,这会强制文本为大写,给它一个大边框,并使其大于默认文本。
                              【解决方案22】:

                              简单灵活的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" />
                              

                              【讨论】:

                                【解决方案23】:

                                一条线解决方案

                                myTextView.setText(Html.fromHtml("&lt;p&gt;&lt;u&gt;I am Underlined text&lt;/u&gt;&lt;/p&gt;"));

                                有点晚了,但可能对某人有用。

                                【讨论】:

                                  【解决方案24】:

                                  试试这个代码

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

                                  祝你好运!

                                  【讨论】:

                                    【解决方案25】:

                                    我知道这是一个迟到的答案,但我想出了一个效果很好的解决方案......我从 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 sn-p 中添加了其他选项,以表明我的示例适用于更改文本颜色、大小和样式...

                                    希望这会有所帮助!

                                    【讨论】:

                                    • 虽然这个例子有效,但我很快意识到,如果你想在 XML 中进行额外的控制,这是行不通的......我已经切换到一个更好的解决方案,它涉及以下步骤: 1) 子类 textview 2) 添加支持以通过自定义属性为文本添加下划线,以执行上面指定的下划线。唯一的区别是,如果设置了自定义属性,则只执行下划线代码。
                                    【解决方案26】:

                                    我在使用自定义字体时遇到问题,并且使用资源文件技巧 (&lt;u&gt;Underlined text&lt;/u&gt;) 创建的下划线确实有效,但 Android 设法将下划线转换为某种打击槽。

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

                                    【讨论】:

                                      【解决方案27】:

                                      你可以试试

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

                                      【讨论】:

                                      • 也许是一个小问题,但 OP 希望在 XML 布局文件中定义它;否则,这是一个很好的解决方案。
                                      • 如果你想清除它,请使用this solution
                                      • 这个解决方案也可以用于Button
                                      • 小心,如果您使用自定义字体或类似字体,您可能还需要| Paint.ANTI_ALIAS_FLAG,否则您的文字看起来会非常清晰。这通常体现在较低的 API 中。
                                      • 在 Kotlin 中:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
                                      猜你喜欢
                                      • 2018-12-27
                                      • 2012-04-18
                                      • 2023-01-08
                                      • 2012-09-07
                                      • 2012-01-23
                                      • 1970-01-01
                                      • 2012-06-07
                                      • 2015-03-04
                                      • 2011-04-13
                                      相关资源
                                      最近更新 更多