คุณขีดเส้นใต้ข้อความใน Android XML อย่างไร


108

คุณขีดเส้นใต้ข้อความในไฟล์ XML อย่างไร ฉันไม่พบตัวเลือกในtextStyle.


คุณได้ลองใช้style="text-decoration: underline;"
ρяσѕρєя K

1
คุณควรใช้วิธีการทั้งหมดได้อย่างไร
Michael Zeuner

คุณได้ลองแล้วtextView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
ρяσѕρєя K

คำตอบ:


174

หากคุณกำลังใช้สตริงทรัพยากรไฟล์ xml (รองรับ HTML แท็ก) ก็สามารถทำได้โดยใช้<b> </b>, และ<i> </i><u> </u>

<resources>
    <string name="your_string_here">
        This is an <u>underline</u>.
    </string>
</resources>

หากคุณต้องการขีดเส้นใต้บางสิ่งจากการใช้รหัส:

TextView tv = (TextView) view.findViewById(R.id.tv);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tv.setText(content);

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


9
ฉันลองสิ่งนี้ สตริงไม่ขึ้นขีดเส้นใต้?
Michael Zeuner

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

คุณไม่จำเป็นต้องตั้งค่าข้อความใน Java แค่ใช้<u>และเป็น<\u>XML ก็เพียงพอแล้ว
Maksim Dmitriev

9
ในกรณีของฉันการแสดงตัวอย่างสตูดิโอ android ไม่สามารถระบุแท็ก html ได้ แต่เมื่อฉันรันโปรเจ็กต์ในอุปกรณ์จริงข้อความที่ขีดเส้นใต้จะแสดงอย่างมีความสุข
Alvin

1
<สีขาว> ความจริงที่ว่าคุณต้องแปลงสตริงเป็น HTML เมื่อ Google ให้ตัวหนา / ตัวเอียง / ปกติแก่เราแล้วนั้นเป็นเรื่องที่ค่อนข้างแย่เมื่อพิจารณาว่าเรามี Android มานานกว่า 5 ปีแล้ว ... </
whine

57

ใช้สิ่งนี้:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

โปรดทราบว่าโซลูชันนี้ขีดเส้นใต้ข้อความทั้งหมดเสมอดังนั้นจึงเป็นไปไม่ได้หากต้องการขีดเส้นใต้เพียงบางส่วน UnderlineSpanเพื่อที่คุณจะต้อง
Giulio Piancastelli

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

หากยังไม่ได้ผล

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

เนื่องจาก "<" อาจเป็นคีย์เวิร์ดในบางครั้ง

และสำหรับการแสดง

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));

3
วิธีนี้ใช้งานได้ ... แต่ถ้าคุณตั้งค่า TextView ให้ใช้แอตทริบิวต์ xml android: textAllCaps = "true" ด้วยเหตุผลบางประการขีดเส้นใต้จะไม่ปรากฏ ลบตัวปรับแต่งนี้และขีดเส้นใต้จะแสดงตามที่ตั้งใจไว้ เพียงแค่หัวขึ้น :)
Matt W

5

ก่อนอื่นไปที่ไฟล์ String.xml

คุณสามารถเพิ่มแอตทริบิวต์ HTML เช่นตัวเอียงหรือตัวหนาหรือขีดเส้นใต้ได้ที่นี่

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>

3

อีกวิธีในการทำเช่นนี้คือการสร้างคอมโพเนนต์ที่กำหนดเองเพื่อขยาย TextView เหมาะสำหรับกรณีที่คุณต้องมี TextView ที่ขีดเส้นใต้หลายอัน

นี่คือรหัสสำหรับส่วนประกอบ:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

และวิธีใช้ใน xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />

2

เพื่อให้ Bhavin ตอบ สำหรับตัวอย่างเพื่อเพิ่มขีดเส้นใต้หรือการเปลี่ยนเส้นทาง

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

และคุณสามารถทราบแท็กที่เข้ากันได้ที่นี่: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html


2

คุณสามารถใช้มาร์กอัปด้านล่าง แต่ทราบว่าถ้าคุณตั้งค่าtextAllCapsจะtrueมีผลต่อการขีดเส้นใต้จะถูกลบออก

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


บันทึก

การใช้ textAllCaps กับสตริง (login_change_settings) ที่มีมาร์กอัป มาร์กอัปจะลดลงโดยการแปลงแคป

การแปลงข้อความ textAllCaps จะลงเอยด้วยการเรียก toString บน CharSequence ซึ่งมีผลสุทธิจากการลบมาร์กอัปใด ๆ เช่น. การตรวจสอบนี้ค้นหาการใช้งานของสตริงที่มีมาร์กอัปที่ระบุ textAllCaps = true ด้วย


2

มีหลายวิธีในการบรรลุข้อความที่ขีดเส้นใต้ใน Android TextView

1. <u>This is my underlined text</u> หรือ

I just want to underline <u>this</u> word

2. คุณสามารถทำแบบเดียวกันโดยใช้โปรแกรม

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

3. สามารถทำได้โดยการสร้าง SpannableString จากนั้นตั้งค่าเป็นคุณสมบัติข้อความ TextView

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);

2

ฉันใช้วิธีการด้านล่างมันได้ผลสำหรับฉัน ด้านล่างเป็นตัวอย่างของปุ่ม แต่เราสามารถใช้ใน TextView ได้เช่นกัน

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

1

หากคุณต้องการเปรียบเทียบสตริงข้อความหรือข้อความจะเปลี่ยนแบบไดนามิกคุณสามารถสร้างมุมมองในเลย์เอาต์ข้อ จำกัด ซึ่งจะปรับตามความยาวของข้อความเช่นนี้

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>

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

รองรับ TextView childs เช่น EditText, Button, Checkbox

ถ้าคุณต้องการ

- ข้อความขีดเส้นใต้ที่คลิกได้?

- ขีดเส้นใต้หลาย ๆ ส่วนของ TextView?

จากนั้นตรวจสอบคำตอบนี้

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