Seperti judulnya, saya ingin tahu apakah mungkin untuk mencapai dua karakter berwarna berbeda dalam satu elemen tampilan teks.
Seperti judulnya, saya ingin tahu apakah mungkin untuk mencapai dua karakter berwarna berbeda dalam satu elemen tampilan teks.
Jawaban:
ya, jika Anda memformat properti String
with html
's font-color
kemudian meneruskannya ke metodeHtml.fromHtml(your text here)
String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));
Html.escapeHtml(str)
.
Html.fromHtml(String)
sekarang sudah ditinggalkan, alih-alih gunakan Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)
. Informasi lebih lanjut dapat ditemukan di sini.
Anda dapat mencetak garis dengan banyak warna tanpa HTML sebagai:
TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");
word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");
wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);
Anda dapat menggunakan Spannable
untuk menerapkan efek ke TextView
:
Berikut adalah contoh saya untuk mewarnai hanya bagian pertama dari sebuah TextView
teks (sambil memungkinkan Anda untuk mengatur warna secara dinamis daripada mengkodekannya menjadi String seperti pada contoh HTML!)
mTextView.setText("Red text is here", BufferType.SPANNABLE);
Spannable span = (Spannable) mTextView.getText();
span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
Dalam contoh ini Anda dapat mengganti 0xFFFF0000 dengan a getResources().getColor(R.color.red)
Saya telah melakukan ini:
Tetapkan Warna pada Teks dengan mengirimkan String dan warna :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Tetapkan teks pada TextView / Button / EditText dll dengan memanggil kode di bawah ini:
TextView:
TextView txtView = (TextView)findViewById(R.id.txtView);
Dapatkan String Berwarna:
String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");
Setel Teks di TextView dari dua string dengan warna berbeda:
txtView.setText(Html.fromHtml(name+" "+surName));
Selesai
Html.fromHtml("...")
dengan panggilan keHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Gunakan SpannableStringBuilder
SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);
SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);
TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);
Hai teman-teman saya sudah melakukan ini, cobalah
TextView textView=(TextView)findViewById(R.id.yourTextView);//init
//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(),
//If you are trying it from Activity then pass className.this or this;
textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));
Di dalam kelas TextViewUtils Anda menambahkan metode ini
/***
*
* @param mString this will setup to your textView
* @param colorId text will fill with this color.
* @return string with color, it will append to textView.
*/
public static Spannable getColoredString(String mString, int colorId) {
Spannable spannable = new SpannableString(mString);
spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d(TAG,spannable.toString());
return spannable;
}
Lebih baik menggunakan string dalam file string, karena itu:
<string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
</string>
Pemakaian:
textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
Saya telah menulis beberapa kode untuk pertanyaan lain yang mirip dengan yang satu ini, tetapi pertanyaan itu digandakan jadi saya tidak bisa menjawabnya di sana jadi saya hanya meletakkan kode saya di sini jika seseorang mencari persyaratan yang sama.
Ini bukan kode yang sepenuhnya berfungsi, Anda perlu membuat beberapa perubahan kecil untuk membuatnya berfungsi.
Ini kodenya:
Saya telah menggunakan gagasan @Graeme tentang penggunaan teks yang dapat dipindai.
String colorfulText = "colorfulText";
Spannable span = new SpannableString(colorfulText);
for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);
Metode Warna Acak:
private int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
Coba ini:
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
Gunakan kelas SpannableBuilder alih-alih pemformatan HTML jika memungkinkan karena lebih cepat daripada parsing format HTML. Lihat tolok ukur saya sendiri "SpannableBuilder vs HTML" di Github Terima kasih!
Jawaban yang luar biasa! Saya bisa menggunakan Spannable untuk membangun teks berwarna pelangi (jadi ini bisa diulang untuk setiap array warna). Inilah metode saya, jika itu membantu siapa pun:
private Spannable buildRainbowText(String pack_name) {
int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
Spannable word = new SpannableString(pack_name);
for(int i = 0; i < word.length(); i++) {
word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return word;
}
Dan kemudian saya hanya setText (buildRainboxText (pack_name)); Perhatikan bahwa semua kata yang saya masukkan di bawah 15 karakter dan ini hanya mengulangi 5 warna 3 kali - Anda ingin menyesuaikan warna / panjang array untuk penggunaan Anda!
if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(String, flag) // for 24 API and more
} else {
Html.fromHtml(String) // or for older API
}
untuk 24 API dan lainnya (bendera)
public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;
Karena API 24 Anda memiliki FROM_HTML_OPTION_USE_CSS_COLORS sehingga Anda dapat menentukan warna dalam CSS alih-alih mengulanginya sepanjang waktu dengan font color="
Jauh lebih jelas - ketika Anda memiliki beberapa html dan Anda ingin menyorot beberapa tag yang telah ditentukan - Anda hanya perlu menambahkan fragmen CSS di atas html Anda
25 Juni 2020 oleh @canerkaseler
Saya ingin membagikan Kotlin Answer :
fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
val spannableStr = SpannableString(tv.text)
val underlineSpan = UnderlineSpan()
spannableStr.setSpan(
underlineSpan,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
spannableStr.setSpan(
backgroundColorSpan,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
val styleSpanItalic = StyleSpan(Typeface.BOLD)
spannableStr.setSpan(
styleSpanItalic,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
tv.text = spannableStr
}
Setelah itu, panggil fungsi di atas. Anda dapat menelepon lebih dari satu:
setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)
Output: Anda dapat melihat garis bawah dan warna yang berbeda satu sama lain.
@canerkaseler