Jawaban:
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);
<u>
tag tidak bekerja, misalnya kadang-kadang jika Anda menggunakan font khusus. Namun, yang mendasari pemrograman oleh UnderlineSpan
belum gagal pada saya, jadi saya akan merekomendasikan itu sebagai solusi yang paling dapat diandalkan.
Anda bisa mencobanya
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
juga atau teks Anda akan terlihat sangat tajam. Ini bermanifestasi dalam API yang lebih rendah lebih sering daripada tidak.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
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 <
, misalnya hasilnya akan terlihat seperti:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</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), ...)));
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"
/>
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);
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:
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:
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!
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);
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>
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" />
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"
/>
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>
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);
}
}
}
sampleTextView.setText(R.string.sample_string);
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.
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.
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
Perhatikan simbol Escape dalam file xml
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.