ฉันสามารถขีดเส้นใต้ข้อความในเค้าโครง Android ได้หรือไม่


คำตอบ:


1144

มันสามารถเกิดขึ้นได้ถ้าคุณกำลังใช้ทรัพยากรสตริงไฟล์ xml ซึ่งรองรับ HTML แท็กเช่น<b></b>, และ<i></i><u></u>

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

49
สวัสดีฉันลองใช้รหัส xml ของทรัพยากรด้านบนและไม่ได้ผล มันยังคงแสดง <u> ขีดเส้นใต้ </u> เป็นข้อความธรรมดาอย่างต่อเนื่อง
Jonathan

4
ดูเพิ่มเติมที่: android.text.Html.fromHtml () ซึ่งส่งคืน Spanned
Mark Renouf

3
คุณควรพิมพ์ลงในไฟล์ strings.xml เองโดยไม่ต้องกดปุ่มเพิ่ม มิฉะนั้นคุณจะได้รับ & lt; u & gt; ในไฟล์ strings.xml ของคุณและ <u> ขีดเส้นใต้ </u> ในรหัสของคุณ
gdrt

3
ฉันเจอกรณีที่<u>แท็กที่อ้างอิงผ่านไม่ทำงานเช่นบางครั้งหากคุณใช้แบบอักษรที่กำหนดเอง อย่างไรก็ตามการเขียนโปรแกรมพื้นฐานโดยUnderlineSpanยังไม่ได้ล้มเหลวกับฉันดังนั้นฉันจะแนะนำให้มันเป็นทางออกที่น่าเชื่อถือที่สุด
Giulio Piancastelli

26
มันจะไม่แสดงในเครื่องมือแก้ไข แต่เมื่อคุณเริ่มแอพคุณ - มันจะถูกขีดเส้นใต้
jean d'arme

534

คุณสามารถลองด้วย

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

1
อาจเป็นจุดเล็ก ๆ น้อย ๆ แต่ OP ต้องการสิ่งนี้กำหนดไว้ในไฟล์รูปแบบ XML; มิฉะนั้นนี่เป็นทางออกที่ดี
kwishnu

4
ใช้วิธีแก้ปัญหานี้หากคุณต้องการล้างมัน
Bobs

2
วิธีนี้สามารถใช้สำหรับปุ่มได้เช่นกัน
Rudy Kurniawan

3
ระวังถ้าคุณใช้แบบอักษรที่กำหนดเองหรือคล้ายกันคุณอาจต้อง| Paint.ANTI_ALIAS_FLAGเช่นกันหรือข้อความของคุณจะดูคม สิ่งนี้ปรากฏใน API ที่ต่ำกว่าบ่อยกว่าไม่
Martin Marconcini

4
ใน Kotlin:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo

72

"การยอมรับ" คำตอบดังกล่าวข้างต้นจะไม่ทำงาน textView.setText(Html.fromHtml(String.format(getString(...), ...)))(เมื่อคุณพยายามที่จะใช้สตริงเช่น

ดังที่ระบุไว้ในเอกสารคุณจะต้องหลบหนี (html เอนทิตีเข้ารหัส) วงเล็บเปิดของแท็กชั้นในด้วย&lt;เช่นผลลัพธ์ควรมีลักษณะดังนี้:

<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), ...)));

4
<u> ขีดเส้นใต้ที่นี่ </u> ทำงานได้อย่างสมบูรณ์ & lt; u> ขีดเส้นใต้ & lt; / u> ไม่ทำงาน นี่สำหรับ Android 2.2 บางทีรุ่นที่แตกต่างตีความมันแตกต่างกัน
898763452

@ autotravis อันไหนที่เหมาะกับ 2.2? ฉันไม่ได้ทดสอบกับเวอร์ชั่นเก่าและมันจะค่อนข้างโชคร้ายถ้ารุ่นที่แตกต่างกันจัดการมันต่างกัน ... นอกจากนี้ยังมีเอกสารอย่างน้อยในปัจจุบันระบุว่ามันจะต้องหลบหนี (ลิงค์อยู่ในคำตอบ)
Ognyan

ฉันได้ทดสอบ <u> ขีดเส้นใต้ </u> บน Android 2.3 แล้ว & lt; u> ขีดเส้นใต้ & lt; / u> ไม่ทำงานสำหรับ 2.3 เอกสารพูดว่า "บางครั้งคุณอาจต้องการสร้างทรัพยากรข้อความสไตล์ที่ใช้เป็นสตริงรูปแบบโดยปกติสิ่งนี้จะไม่ทำงานเนื่องจากเมธอด String.format (String, Object ... ) จะดึงข้อมูลสไตล์ทั้งหมดออก จากสตริงการหลีกเลี่ยงปัญหานี้คือการเขียนแท็ก HTML ด้วยเอนทิตีที่หลบหนีซึ่งจะถูกกู้คืนด้วย fromHtml (String) หลังจากการจัดรูปแบบเกิดขึ้น " ดังนั้นฉันเดาว่าคุณจะใช้การหลบหนีถ้าคุณเรียกใช้ผ่านวิธีการ String.format (... )
898763452

@ autotravis ใช่คุณถูกต้อง ฉันใช้กับ String.format (... ) ฉันได้แก้ไขคำตอบแล้วขอบคุณสำหรับความคิดเห็นของคุณ
Ognyan

ใน 2.3 และ 4.1 (เฉพาะที่ฉันลองมาแล้ว) คุณสามารถใช้ textView.setText (getText (R.string.text)) แทนการใช้ getString (), Html.fromHtml () และ String.format ()
Roy Solberg

59

เนื้อหาไฟล์ 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"
    />

3
ตรวจสอบให้แน่ใจว่าคุณแก้ไขไฟล์ทรัพยากรสตริงภายใน XML จริงแทนที่จะอยู่ภายใน UI การแก้ไขผู้ช่วยใน Eclipse ที่จะหนี <s
Chris Rae

51

สำหรับปุ่มและ TextView นี่เป็นวิธีที่ง่ายที่สุด:

ปุ่ม:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

TextView:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

ทางออกที่หรูหรามาก ขอบคุณ!
เอเดรีย

20

ทางออกเดียว

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

มันช้าไปหน่อย แต่อาจมีประโยชน์สำหรับใครบางคน


19

ในฟังก์ชั่นการขยาย Kotlin สามารถใช้ได้ สามารถใช้จากรหัสไม่ใช่ xml

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

การใช้งาน:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

ตรวจสอบรูปแบบปุ่มแบบคลิกได้ที่ขีดเส้นใต้:

<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 อธิบายไว้คุณสามารถทำมันได้
xarlymg89

11

วิธีการล่าสุดของการวาดภาพขีดเส้นใต้ข้อความอธิบายโดย Romain ผู้ชายในขนาดกลางที่มีรหัสแหล่งที่มาที่มีอยู่บนGitHub แอปพลิเคชันตัวอย่างนี้แสดงการใช้งานที่เป็นไปได้สองแบบ:

  • การนำไปใช้ตามเส้นทางที่ต้องใช้ API ระดับ 19
  • การใช้งานตามภูมิภาคที่ต้องการ API ระดับ 1

ป้อนคำอธิบายรูปภาพที่นี่


10

ฉันรู้ว่านี่เป็นคำตอบที่ช้า แต่ฉันคิดวิธีแก้ปัญหาที่ใช้งานได้ดี ... ฉันได้รับคำตอบจาก Anthony Forloney สำหรับการขีดเส้นใต้ข้อความในรหัสและสร้าง subclass ของ TextView ที่จัดการสิ่งนั้นให้คุณ จากนั้นคุณสามารถใช้คลาสย่อยใน XML เมื่อใดก็ตามที่คุณต้องการให้มี TextView ที่ขีดเส้นใต้

นี่คือคลาสที่ฉันสร้าง:

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
ในขณะที่ตัวอย่างนี้ใช้งานได้ฉันรู้ได้อย่างรวดเร็วว่าหากคุณต้องการควบคุมเพิ่มเติมใน XML ซึ่งสิ่งนี้จะไม่ทำ ... ฉันได้เปลี่ยนเป็นโซลูชันที่ดีกว่าซึ่งเกี่ยวข้องกับขั้นตอนต่อไปนี้: 1) Subclass textview 2) เพิ่มการสนับสนุน เพื่อขีดเส้นใต้ข้อความผ่านแอตทริบิวต์ที่กำหนดเองเพื่อทำการขีดเส้นใต้ตามที่ระบุข้างต้น ความแตกต่างเพียงอย่างเดียวคือคุณรันโค้ดขีดเส้นใต้หากมีการตั้งค่าแอตทริบิวต์ที่กำหนดเอง
Justin

10

วิธีที่สะอาดกว่า
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); วิธีนี้คือการใช้ textView.getPaint().setUnderlineText(true);

และหากคุณต้องการปิดการขีดเส้นใต้สำหรับมุมมองนั้นในภายหลังเช่นในมุมมองที่นำกลับมาใช้ใหม่ใน RecyclerView textView.getPaint().setUnderlineText(false);


7

เพียงใช้แอตทริบิวต์ในไฟล์ทรัพยากรสตริงเช่น

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

7

ฉันใช้ drawable xml นี้เพื่อสร้างเส้นขอบด้านล่างและใช้ drawable เป็นพื้นหลังกับมุมมองข้อความของฉัน

<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 มันเป็นสิ่งจำเป็นมุมมองของคุณจะมีพื้นหลังสีดำโดยไม่ต้องมัน
Ivan Mitsura

5

โซลูชันที่ง่ายและยืดหยุ่นใน 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" />

4

อีกวิธีคือสร้างมุมมองที่กำหนดเองที่ขยาย 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"
 />

น่ากลัว !! แต่สีของขีดเส้นใต้เป็นสีเทาจะเปลี่ยนเป็นสีดำหรือสีอื่นได้อย่างไร
OhhhThatVarun

3

ฉันทำให้คำตอบของซามูเอลง่ายขึ้น:

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

3

ฉันสร้างวิธีนี้เพื่อความสะดวก

TextView tv = findViewById(R.id.tv);
tv.setText("some text");

ขีดเส้นใต้ทั้ง TextView

setUnderLineText(tv, tv.getText().toString());

ขีดเส้นใต้บางส่วนของ TextView

setUnderLineText(tv, "some");

รองรับ TextView childs เช่น 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


2

ลองรหัสนี้

ใน 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)));

โชคดี!


2
  1. ไปที่ไฟล์ทรัพยากร strings.xml
  2. เพิ่มสตริงในไฟล์ทรัพยากรที่มีแท็กขีดเส้นใต้ HTML หากจำเป็น

ตัวอย่างการขีดเส้นใต้ HTML.xml

  1. โทร ID ทรัพยากรสตริงในรหัส Java ของคุณดังต่อไปนี้:
sampleTextView.setText(R.string.sample_string);
  1. ผลลัพธ์ควรมีคำว่า "Stackoverflow" ขีดเส้นใต้

นอกจากนี้รหัสต่อไปนี้จะไม่พิมพ์ขีดเส้นใต้:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

ให้ใช้รหัสต่อไปนี้แทนเพื่อรักษารูปแบบ Rich Text:

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

ฉันหวังว่านี่จะช่วยได้.


2

คำตอบที่ได้รับการโหวตอย่างถูกต้องและง่ายที่สุด อย่างไรก็ตามบางครั้งคุณอาจพบว่าไม่ได้ทำงานกับตัวอักษรบางตัว แต่ทำงานกับคนอื่น ๆ (ปัญหาที่ฉันเพิ่งเจอเมื่อพูดภาษาจีน)

โซลูชันไม่ใช้ "WRAP_CONTENT" สำหรับ TextView ของคุณเท่านั้นทำให้ไม่มีพื้นที่เพิ่มเติมสำหรับการวาดเส้น คุณสามารถตั้งค่าความสูงคงที่เป็น TextView ของคุณหรือใช้ android: paddingVertical ด้วย WRAP_CONTENT


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

หมายเหตุสัญลักษณ์ Escape ในไฟล์ xml


ทำงานให้ฉันด้วย symboles หลบหนีขอบคุณ!
Badr เมื่อ


0

มันค่อนข้างช้าที่จะตอบคำถามนี้ แต่สมมติว่าถ้าใครต้องการได้รับข้อความแบบไดนามิกจากนั้นพวกเขาสามารถใช้หนึ่งบรรทัดที่เรียบง่ายนี้ในรหัส java ของพวกเขาที่ทำงาน:

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

-2

ฉันมีปัญหาที่ฉันใช้แบบอักษรที่กำหนดเองและขีดเส้นใต้ที่สร้างขึ้นพร้อมกับเคล็ดลับไฟล์ทรัพยากร ( <u>Underlined text</u>) ทำงานได้ แต่ Android สามารถเปลี่ยนขีดเส้นใต้เป็นรางตีได้

ผมใช้คำตอบนี้ไปวาดเส้นขอบด้านล่าง TextView ตัวเอง: https://stackoverflow.com/a/10732993/664449 เห็นได้ชัดว่าวิธีนี้ใช้ไม่ได้กับข้อความที่ขีดเส้นใต้หรือข้อความหลายบรรทัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.