Изменение цвета текста одного слова в TextView
Я ищу способ изменить цвет текста одно слово, в TextView
внутри Activity
.
например, вот это:
String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);
как бы я изменил цвет next
текст красного цвета?
6 ответов:
самый простой способ, который я знаю, это просто использовать html.
String first = "This word is "; String next = "<font color='#EE0000'>red</font>"; t.setText(Html.fromHtml(first + next));
но это потребует от вас перестроить TextView, когда (если?) вы хотите изменить цвет, который может вызвать хлопоты.
t.setText(first + next, BufferType.SPANNABLE); Spannable s = (Spannable)t.getText(); int start = first.length(); int end = start + next.length(); s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
вы должны использовать spannable это также позволит вам увеличить размер текста, сделать его полужирным и т. д.... даже в какой-то образ.
используйте 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);
если вы хотите изменить состояние всех экземпляров определенного
String
внутриTextView
текст (без учета регистра) вы можете использоватьStringBuilder
s иSpannableString
такой:StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString()); StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString)); SpannableString spannableString = new SpannableString(myTextView.getText().toString()); int counter = 0; int index = 0; for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++) { counter = 0; if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index))) { counter++; index++; for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++) { if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index))) { counter++; index++; } else { index++; if (index % mySearchedString.length() == 0) { index = 0; } break; } } if (counter == mySearchedString.length() - 1) // A match { spannableString.setSpan(new ForegroundColorSpan(Color.RED), i, i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red) index = 0; continue; } else { index = 0; continue; } } } myTextView.setText(spannableString);
}
- хранить
TextView
текст внутриStringBuilder
.- хранить искомую строку внутри
StringBuilder
.- хранить весь
TextView
текст внутриSpannableString
- сделать простую операцию, чтобы найти все теги
String
экземпляров внутри элементTextView
текст и изменить их при достижении.- выберите текстовое значение
TextView
доSpannableString
.
для длинной строки вы можете использовать это:
String help = getString(R.string.help); help = help.replace("some word", "<font color='#EE0000'>some word</font>"); txtDesc.setText(Html.fromHtml(help));
я реализовал функцию полезности в Kotlin для моего собственного usecase и, возможно, полезен для кого-то еще.
fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String, targetColor: Int) = SpannableStringBuilder(fullText).apply { setSpan(ForegroundColorSpan(targetColor), fullText.indexOf(textToBold), (fullText.indexOf(textToBold) + textToBold.length), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) }
Как я использую его:
context?.let { infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor( wordAsBold, completeSentence, ContextCompat.getColor(it, R.color.white)) }