Apakah mungkin untuk mengatur beberapa gaya untuk potongan teks yang berbeda di dalam TextView?
Misalnya, saya mengatur teks sebagai berikut:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Apakah mungkin untuk memiliki gaya yang berbeda untuk setiap elemen teks? Misal, line1 bold, word1 italic, dll.
Tugas Umum panduan pengembang dan Cara Melakukannya di Android termasuk Memilih, Menyorot, atau Styling Bagian Teks :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Tapi itu menggunakan nomor posisi eksplisit di dalam teks. Apakah ada cara yang lebih bersih untuk melakukan ini?
Jawaban:
Dalam hal, ada yang bertanya-tanya bagaimana melakukan ini, ini salah satu caranya: (Terima kasih kepada Mark lagi!)
Untuk daftar tag tidak resmi yang didukung oleh metode ini, lihat tautan ini atau pertanyaan ini: Tag HTML mana yang didukung oleh Android TextView?
sumber
formatTextWhite(string text)
bahwa hanya menyisipkan teks ke dalam format string berikut:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Saya ingat ini kembali bekerja untuk saya. Tidak yakin apakah masih berfungsi.Html.fromHtml("<font color=\"#999999\">
urutan pelarian bekerja untuk saya :) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
terima kasihCoba
Html.fromHtml()
, dan tandai teks Anda dengan tag HTML tebal dan miring misalnya:sumber
monthText + " " + month.getYearLabel()
. LihatStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
jika Anda tidak membutuhkan masing-masing bagian.Agak di luar topik, tetapi saya menemukan ini terlalu berguna untuk tidak disebutkan di sini.
Bagaimana jika kita ingin membaca teks Html dari sumber string.xml dan dengan demikian membuatnya mudah untuk dilokalkan. CDATA memungkinkan ini:
Dari kode Java kami, kami sekarang dapat menggunakannya seperti ini:
Saya tidak berharap ini bekerja. Tapi itu terjadi.
Semoga bermanfaat bagi sebagian dari Anda!
sumber
"@string/someText"
(di mana "someText" adalah sumber daya yang didefinisikan dalam strings.xml), saya hanya mendapatkan string dengan semua tag HTML sebagai 'teks'.Jika Anda merasa tidak ingin menggunakan html, Anda bisa membuat styles.xml dan menggunakannya seperti ini:
sumber
$1%s is a happy $2%s
di bundel string. Anda harus mengizinkan token untuk diatur ulang.Lebih ringan untuk menggunakan
SpannableString
markup html. Ini membantu saya untuk melihat contoh visual jadi inilah jawaban tambahan.Ini adalah single
TextView
.Pelajaran lanjutan
Contoh ini awalnya terinspirasi dari sini .
sumber
Daftar tag yang didukung adalah:
(Dari http://developer.android.com/guide/faq/commontasks.html#selectingtext - tautan Web Archive,
<resource>
salah ketik itu asli!)Ini juga menunjukkan bahwa
Html.fromHtml
sebenarnya tidak diperlukan dalam kasus-kasus sederhana.sumber
Saya mengalami masalah yang sama. Saya bisa menggunakan fromHtml, tapi sekarang saya android, bukan web, jadi saya memutuskan untuk mencobanya. Saya harus melokalkan ini jadi saya mencobanya menggunakan konsep penggantian string. Saya mengatur gaya pada TextView menjadi gaya utama, kemudian hanya memformat peices lainnya.
Saya harap ini membantu orang lain yang ingin melakukan hal yang sama - Saya tidak tahu mengapa ini tidak mudah dalam kerangka kerja.
Senar saya terlihat seperti ini:
Berikut adalah gaya-gayanya:
Ini kode saya yang memanggil metode formatStyles saya:
Metode format:
sumber
Sekarang
<b>
elemen sudah usang.<strong>
merender sebagai<b>
, dan<em>
menjadikan sebagai<i>
.ini berfungsi baik untuk saya
sumber
Berikut adalah cara mudah untuk melakukannya menggunakan HTMLBuilder
Hasil:
Beberapa teks tebal Beberapa teks miring
sumber
Jika Anda ingin dapat menambahkan teks gaya dalam xml Anda dapat membuat tampilan kustom memperluas TextView dan menimpa setText ():
Kemudian, Anda dapat menggunakannya seperti ini (ganti
PACKAGE_NAME
dengan nama paket Anda):sumber
Seperti yang dinyatakan, gunakan
TextView.setText(Html.fromHtml(String))
Dan gunakan tag ini dalam string berformat Html Anda:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
sumber
Saya juga
Bagaimana kalau menggunakan markup indah dengan Kotlin dan Anko -
sumber
Ya, dimungkinkan menggunakan
SpannedString
. Jika Anda menggunakan Kotlin, itu menjadi lebih mudah dilakukan dengan menggunakancore-ktx
, karena menyediakan bahasa khusus domain (DSL) untuk melakukan ini:Lebih banyak opsi yang disediakan olehnya adalah:
Akhirnya, Anda bisa langsung ke:
sumber
Bahkan, kecuali objek Html, Anda juga bisa menggunakan kelas tipe Spannable, mis. TextAppearanceSpan atau TypefaceSpan dan SpannableString. Kelas html juga menggunakan mekanisme ini. Tetapi dengan kelas tipe Spannable, Anda memiliki lebih banyak kebebasan.
sumber
Mungkin sesederhana memanfaatkan metode panjang String ():
Pisahkan string teks dalam file XML Strings menjadi banyak sub-string (string terpisah dari sudut pandang Android) sebanyak yang Anda butuhkan gaya yang berbeda, sehingga bisa seperti: str1, str2, str3 (seperti dalam kasus Anda), yang ketika digabungkan bersama adalah seluruh string tunggal yang Anda gunakan.
Dan kemudian cukup ikuti metode "Rentang", sama seperti Anda disajikan dengan kode Anda - tetapi alih-alih satu string, gabungkan semua substring yang menggabungkannya menjadi satu, masing-masing dengan gaya kustom yang berbeda.
Anda masih menggunakan angka-angka, namun tidak secara langsung - mereka tidak lagi mengambil bentuk hardcode (seperti dalam kode Anda) sekarang, tetapi mereka diganti dengan metode panjang gabungan () (perhatikan dua bintang sebelum dan akhiran str. length () sebagai pengganti angka absolut untuk menghilangkan perubahan):
untuk ukuran string pertama, kemudian str.length () + 1, str.length () + str2.length () untuk ukuran string kedua, dan seterusnya dengan semua substring, bukan misalnya 0,7 atau 8,19 dan seterusnya...
sumber
Menggunakan Kelas Spannable tambahan sebagai Android String Resources berbagi di bagian bawah halaman web. Anda dapat mendekati ini dengan membuat
CharSquences
dan memberi mereka gaya.Tetapi dalam contoh yang mereka berikan kepada kami, hanya untuk teks tebal, miring, dan bahkan berwarna. Saya perlu membungkus beberapa gaya dalam
CharSequence
untuk mengaturnya dalamTextView
. Jadi untuk Kelas itu (saya menamainyaCharSequenceStyles
) saya baru saja menambahkan fungsi ini.Dan dalam pandangan saya menambahkan ini.
Saya harap ini membantu Anda!
sumber
Spanny membuat SpannableString lebih mudah digunakan.
sumber
Seperti yang dikatakan Jon , bagi saya ini adalah solusi terbaik dan Anda tidak perlu mengatur teks saat runtime, hanya gunakan kelas khusus ini HtmlTextView
dan itu saja, sekarang hanya taruh di XML Anda
dengan String Html Anda
sumber