Jak mówi tytuł, chcę wiedzieć, czy można uzyskać dwa różne kolorowe znaki w jednym elemencie Textview.
Jak mówi tytuł, chcę wiedzieć, czy można uzyskać dwa różne kolorowe znaki w jednym elemencie Textview.
Odpowiedzi:
tak, jeśli sformatujesz właściwość String
with html
, font-color
przekaż ją do metodyHtml.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)
jest teraz przestarzała, zamiast tego użyj Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)
. Więcej informacji można znaleźć tutaj.
Możesz drukować wiersze w wielu kolorach bez kodu HTML jako:
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);
Możesz użyć, Spannable
aby zastosować efekty do TextView
:
Oto mój przykład na kolorowanie tylko pierwszej części TextView
tekstu (pozwalając na dynamiczne ustawianie koloru, a nie na sztywne kodowanie go w łańcuchu, jak w przykładzie 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);
W tym przykładzie możesz zamienić 0xFFFF0000 na getResources().getColor(R.color.red)
Zrobiłem w ten sposób:
Zestaw kolorów na tekst przez przepuszczenie String i kolor :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Ustaw tekst na TextView / Button / EditText itp., Wywołując poniższy kod:
Widok tekstu:
TextView txtView = (TextView)findViewById(R.id.txtView);
Zdobądź kolorowy sznur:
String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");
Ustaw tekst w TextView dwóch ciągów o różnych kolorach:
txtView.setText(Html.fromHtml(name+" "+surName));
Gotowe
Html.fromHtml("...")
połączenia doHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Użyj 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);
Hej, zrobiłem to, spróbujcie
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)));
Wewnątrz klasy TextViewUtils dodaj tę metodę
/***
*
* @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;
}
Lepiej jest użyć ciągu w pliku ciągów, jako takiego:
<string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
</string>
Stosowanie:
textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
Napisałem kod dla innego pytania, które jest podobne do tego, ale to pytanie zostało zduplikowane, więc nie mogę tam odpowiedzieć, więc umieszczam tutaj mój kod, jeśli ktoś szuka tego samego wymagania.
To nie jest w pełni działający kod, musisz wprowadzić drobne zmiany, aby działał.
Oto kod:
Skorzystałem z pomysłu @Graeme, aby używać spannable text.
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);
Losowa metoda koloru:
private int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
Spróbuj tego:
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
Tam, gdzie to możliwe, należy używać klasy SpannableBuilder zamiast formatowania HTML, ponieważ jest to szybsze niż analizowanie formatu HTML. Zobacz mój własny test porównawczy „SpannableBuilder vs HTML” na Github Dzięki!
Niesamowite odpowiedzi! Udało mi się użyć Spannable do zbudowania tekstu w kolorze tęczy (więc można to powtórzyć dla dowolnej tablicy kolorów). Oto moja metoda, jeśli komuś pomoże:
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;
}
A potem po prostu setText (buildRainboxText (nazwa_paczki)); Zwróć uwagę, że wszystkie słowa, które przekazuję, mają mniej niż 15 znaków, a to po prostu powtarza 5 kolorów 3 razy - chcesz dostosować kolory / długość tablicy do swoich potrzeb!
if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(String, flag) // for 24 API and more
} else {
Html.fromHtml(String) // or for older API
}
dla 24 API i więcej (flaga)
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;
Od API 24 masz FROM_HTML_OPTION_USE_CSS_COLORS, więc możesz definiować kolory w CSS zamiast powtarzać to za każdym razem z font color="
Dużo wyraźniejszym - kiedy masz trochę html i chcesz podświetlić jakieś predefiniowane tagi - wystarczy dodać fragment CSS na górze html
25 czerwca 2020 by @canerkaseler
Chciałbym podzielić się odpowiedzią Kotlin :
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
}
Następnie wywołaj powyższą funkcję. Możesz zadzwonić do więcej niż jednego:
setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)
Wynik: możesz zobaczyć podkreślenie i różne kolory.
@canerkaseler