Bisakah saya menggarisbawahi teks dalam tata letak Android?

Jawaban:

1144

Ini dapat dicapai jika Anda menggunakan file xml sumber daya string , yang mendukung tag HTML seperti <b></b>, <i></i>dan <u></u>.

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

Jika Anda ingin menggarisbawahi sesuatu dari penggunaan kode:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);
Anthony Forloney
sumber
49
Hai, saya mencoba kode sumber xml di atas dan tidak berhasil. terus menampilkan <u> garis bawah </u> sebagai teks biasa
Jonathan
4
Lihat juga: android.text.Html.fromHtml () yang mengembalikan Spanned.
Mark Renouf
3
Anda harus mengetiknya di file strings.xml itu sendiri, tidak melakukannya dengan tombol add. Kalau tidak, Anda akan mendapatkan ini & lt; u & gt; di file strings.xml Anda dan <u> garis bawahi </u> dalam kode Anda
gdrt
3
Saya menemukan kasus ketika mendasari melalui <u>tag tidak bekerja, misalnya kadang-kadang jika Anda menggunakan font khusus. Namun, yang mendasari pemrograman oleh UnderlineSpanbelum gagal pada saya, jadi saya akan merekomendasikan itu sebagai solusi yang paling dapat diandalkan.
Giulio Piancastelli
26
Itu tidak akan ditampilkan di editor, tetapi ketika Anda memulai aplikasi Anda - itu akan digarisbawahi.
jean d'arme
534

Anda bisa mencobanya

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
vado
sumber
1
Mungkin titik kecil, tetapi OP ingin ini didefinisikan dalam file layout XML; jika tidak, ini adalah solusi yang bagus.
kwishnu
4
gunakan solusi ini jika Anda ingin menghapusnya
Bobs
2
solusi ini dapat digunakan untuk Button juga
Rudy Kurniawan
3
Hati-hati jika Anda menggunakan font khusus atau yang serupa, Anda mungkin perlu melakukannya | Paint.ANTI_ALIAS_FLAGjuga atau teks Anda akan terlihat sangat tajam. Ini bermanifestasi dalam API yang lebih rendah lebih sering daripada tidak.
Martin Marconcini
4
Di Kotlin:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo
72

Jawaban "diterima" di atas TIDAK berfungsi (ketika Anda mencoba menggunakan string seperti textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Seperti yang dinyatakan dalam dokumentasi Anda harus melarikan diri (html entitas dikodekan) dengan membuka braket tag batin &lt;, misalnya hasilnya akan terlihat seperti:

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

Kemudian dalam kode Anda, Anda dapat mengatur teks dengan:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
Ognyan
sumber
4
<u> digarisbawahi di sini </u> berfungsi dengan baik. & lt; u> garis bawahi & lt; / u> tidak berfungsi. Ini untuk Android 2.2. Mungkin versi yang berbeda menafsirkannya secara berbeda.
user898763452
@autotravis yang mana untuk 2.2? Saya tidak mengujinya pada versi yang lebih lama dan akan sangat disayangkan jika versi yang berbeda menanganinya secara berbeda ... Juga setidaknya dokumentasi saat ini menyatakan bahwa itu harus diloloskan (tautan ada dalam jawabannya).
Ognyan
Saya telah menguji <u> yang digarisbawahi </u> di Android 2.3 dan berfungsi. & lt; u> garis bawahi & lt; / u> tidak berfungsi untuk 2.3. Dokumen mengatakan "Kadang-kadang Anda mungkin ingin membuat sumber daya teks gaya yang juga digunakan sebagai format string. Biasanya, ini tidak akan berfungsi karena metode String.format (String, Object ...) akan menghapus semua informasi gaya dari string. Cara mengatasinya adalah menulis tag HTML dengan entitas yang lolos, yang kemudian dipulihkan dengan fromHtml (String), setelah pemformatan berlangsung. " Jadi saya kira Anda akan menggunakan pelolosan jika Anda menjalankannya melalui metode String.format (...).
user898763452
@autotravis ya, Anda benar. Saya menggunakannya dengan String.format (...). Saya telah mengedit jawaban saya, terima kasih atas tanggapan Anda.
Ognyan
Pada 2.3 dan 4.1 (hanya yang saya coba sejauh ini) Anda bisa menggunakan textView.setText (getText (R.string.text)) daripada harus menggunakan getString (), Html.fromHtml () dan String.format ().
Roy Solberg
59

Konten file Strings.xml:

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

Layout xml file shold menggunakan sumber daya string di atas dengan properti textview di bawah ini, seperti yang ditunjukkan di bawah ini:

<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"
    />
Devendra Anurag
sumber
3
Pastikan Anda mengedit file sumber string di dalam XML yang sebenarnya daripada di dalam UI pengeditan pembantu di Eclipse, karena itu akan keluar dari <s.
Chris Rae
51

Untuk Button dan TextView ini adalah cara termudah:

Tombol:

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);
awsleiman
sumber
Solusi yang sangat elegan. Terima kasih!
Adrian
20

Solusi satu baris

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

Agak terlambat tetapi bisa bermanfaat bagi seseorang.

gprathour
sumber
19

Dalam fungsi ekstensi Kotlin dapat digunakan. Ini hanya dapat digunakan dari kode, bukan xml.

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

Pemakaian:

 tv_change_number.underline()
 tv_resend_otp.underline()
Pembunuh
sumber
13

lihat gaya tombol yang dapat diklik bergaris bawah:

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

Hasil:

masukkan deskripsi gambar di sini

Kirill Vashilo
sumber
Tampilan dan nuansa Widget.AppCompat.Button.Borderless.Colored jauh lebih baik daripada menggarisbawahi, seperti yang dijelaskan oleh @Kiril Vashilo, Anda tetap bisa melakukannya.
xarlymg89
11

Pendekatan terbaru menggambar teks yang digarisbawahi dijelaskan oleh Romain Guy di media dengan kode sumber yang tersedia di GitHub . Aplikasi sampel ini memperlihatkan dua kemungkinan implementasi:

  • Implementasi berbasis jalur yang membutuhkan API level 19
  • Implementasi berbasis wilayah yang membutuhkan API level 1

masukkan deskripsi gambar di sini

Volodymyr
sumber
10

Saya tahu ini adalah jawaban yang terlambat, tetapi saya datang dengan solusi yang bekerja cukup baik ... Saya mengambil jawaban dari Anthony Forloney untuk menggarisbawahi teks dalam kode dan membuat subkelas dari TextView yang menangani itu untuk Anda. Kemudian Anda bisa menggunakan subkelas dalam XML kapan pun Anda ingin memiliki TextView yang digarisbawahi.

Inilah kelas yang saya buat:

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

Sekarang ... setiap kali Anda ingin membuat tampilan teks yang digarisbawahi dalam XML, Anda cukup melakukan hal berikut:

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

Saya telah menambahkan opsi tambahan dalam cuplikan XML ini untuk menunjukkan bahwa contoh saya berfungsi dengan mengubah warna teks, ukuran, dan gaya ...

Semoga ini membantu!

Justin
sumber
2
Sementara contoh ini berfungsi, saya segera menyadari bahwa jika Anda ingin memiliki kontrol tambahan dalam XML, ini tidak akan berhasil ... Saya telah beralih ke solusi yang lebih baik yang melibatkan langkah-langkah berikut: 1) Subclass textview 2) Tambahkan dukungan untuk menggarisbawahi teks melalui atribut khusus untuk melakukan garis bawah seperti yang ditentukan di atas. Satu-satunya perbedaan adalah bahwa Anda hanya menjalankan kode garis bawah jika atribut khusus diatur.
Justin
10

Cara yang lebih bersih daripada
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); metode ini adalah dengan menggunakan textView.getPaint().setUnderlineText(true);

Dan jika Anda perlu mematikan garis bawah untuk tampilan itu, seperti dalam tampilan yang digunakan kembali dalam RecyclerView, textView.getPaint().setUnderlineText(false);

jk7
sumber
7

Cukup gunakan atribut dalam file sumber string misalnya

<string name="example"><u>Example</u></string>
Aditya S.
sumber
7

Saya menggunakan xml drawable ini untuk membuat batas bawah dan menerapkan drawable sebagai latar belakang ke tampilan teks saya

<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>
Samuel
sumber
ini adalah solusi sempurna untuk semua tampilan yang digarisbawahi dengan warna kustom. jangan tidak menghargai latar belakang transparan di sini, karena android 4 diperlukan, tampilan Anda akan memiliki latar belakang hitam tanpa itu
Ivan Mitsura
5

Solusi sederhana dan fleksibel dalam 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" />
pengguna3786340
sumber
4

solusi lain adalah membuat tampilan kustom yang memperluas TextView seperti yang ditunjukkan di bawah ini

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

}

dan tambahkan saja ke xml seperti yang ditunjukkan di bawah ini

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />
has19
sumber
Hebat !! Tetapi warna garis bawah adalah abu-abu bagaimana mengubahnya menjadi hitam atau warna lain?
OhhhThatVarun
3

Saya menyederhanakan jawaban 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>
Darush
sumber
3

Saya membuat metode ini untuk memudahkan

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

Garisbawahi seluruh TextView

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

Garisbawahi beberapa bagian dari TextView

setUnderLineText(tv, "some");

Juga mendukung anak-anak TextView seperti 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);
            }
        }
    }

periksa jawaban saya di sini untuk membuat teks garis bawah yang dapat diklik atau menggarisbawahi beberapa bagian dari TextView

Khemraj
sumber
2

coba kode ini

dalam XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

dalam kode

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

Semoga berhasil!

Andrew.J
sumber
2
  1. Buka file sumber strings.xml
  2. Tambahkan string dalam file sumber daya dengan tag garis bawah HTML jika perlu.

strings.xml HTML menggarisbawahi sampel

  1. Panggil ID sumber daya string dalam kode Java Anda sebagai berikut:
sampleTextView.setText(R.string.sample_string);
  1. Output harus memiliki kata "Stackoverflow" yang digarisbawahi.

Selanjutnya, kode berikut tidak akan mencetak garis bawah:

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

Alih-alih, gunakan kode berikut untuk mempertahankan format teks kaya:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"Anda dapat menggunakan getString (int) atau getText (int) untuk mengambil string. GetText (int) mempertahankan gaya teks kaya apa pun yang diterapkan pada string." Dokumentasi Android.

Lihat dokumentasi: https://developer.android.com/guide/topics/resources/string-resource.html

Saya harap ini membantu.

Fahmi Eshaq
sumber
2

Jawaban terpilih teratas adalah benar dan paling sederhana. Namun, kadang-kadang Anda mungkin menemukan itu tidak berfungsi untuk beberapa font, tetapi bekerja untuk orang lain. (Masalah yang baru saja saya temui ketika berhadapan dengan bahasa Cina.)

Solusi adalah jangan gunakan "WRAP_CONTENT" hanya untuk TextView Anda, karena tidak ada ruang tambahan untuk menggambar garis. Anda dapat mengatur ketinggian tetap ke TextView Anda, atau menggunakan android: paddingVertical dengan WRAP_CONTENT.

Ray Lee
sumber
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>

Perhatikan simbol Escape dalam file xml

lynn8570
sumber
bekerja untuk saya dengan symboles melarikan diri, Terima kasih!
Badr Pada
1

Untuk melakukannya di Kotlin:

yourTextView.paint?.isUnderlineText = true

Reem
sumber
0

Cukup terlambat untuk menjawab ini, tetapi anggaplah jika seseorang ingin mendapatkan teks secara dinamis maka mereka dapat menggunakan satu baris sederhana ini dalam kode java mereka yang berfungsi:

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

Saya punya masalah ketika saya menggunakan font khusus dan garis bawah yang dibuat dengan trik file sumber daya ( <u>Underlined text</u>) berhasil tetapi Android berhasil mengubah garis bawah menjadi semacam palung pemogokan.

Saya menggunakan jawaban ini untuk menggambar perbatasan di bawah tampilan teks sendiri: https://stackoverflow.com/a/10732993/664449 . Jelas ini tidak berfungsi untuk sebagian teks yang digarisbawahi atau teks banyak sisi.

Rick Pastoor
sumber