Như tiêu đề đã nói, tôi muốn biết là có thể đạt được hai ký tự có màu khác nhau trong một thành phần textview duy nhất.
Như tiêu đề đã nói, tôi muốn biết là có thể đạt được hai ký tự có màu khác nhau trong một thành phần textview duy nhất.
Câu trả lời:
vâng, nếu bạn định dạng String
với html
's font-color
tài sản sau đó vượt qua nó để phương pháp nàyHtml.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)
bây giờ không dùng nữa, thay vào đó sử dụng Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)
. Thông tin chi tiết có thể được tìm thấy ở đây.
Bạn có thể in các dòng có nhiều màu mà không cần HTML như:
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);
Bạn có thể sử dụng Spannable
để áp dụng hiệu ứng choTextView
:
Dưới đây là ví dụ của tôi để tô màu chỉ phần đầu tiên của TextView
văn bản (trong khi cho phép bạn thiết lập màu sắc linh hoạt thay vì mã hóa cứng thành Chuỗi như với ví dụ 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);
Trong ví dụ này, bạn có thể thay thế 0xFFFF0000 bằng getResources().getColor(R.color.red)
Tôi đã làm theo cách này:
Đặt màu trên văn bản bằng cách chuyển Chuỗi và màu :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Đặt văn bản trên TextView / Nút / EditText, v.v. bằng cách gọi mã bên dưới:
Xem văn bản:
TextView txtView = (TextView)findViewById(R.id.txtView);
Nhận chuỗi màu:
String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");
Đặt Text trên TextView của hai chuỗi có màu khác nhau:
txtView.setText(Html.fromHtml(name+" "+surName));
Làm xong
Html.fromHtml("...")
bằng các cuộc gọi đếnHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Sử dụng 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);
Này các bạn, tôi đã làm điều này, hãy thử nó
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)));
Bên trong bạn lớp TextViewUtils thêm phương thức này
/***
*
* @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;
}
Tốt hơn là sử dụng chuỗi trong tệp chuỗi, như vậy:
<string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
</string>
Sử dụng:
textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
Tôi đã viết ra một số mã cho câu hỏi khác tương tự câu hỏi này, nhưng câu hỏi đó đã bị trùng lặp vì vậy tôi không thể trả lời ở đó vì vậy tôi chỉ đặt mã của mình ở đây nếu ai đó tìm kiếm cùng một yêu cầu.
Đó không phải là mã hoạt động đầy đủ, bạn cần thực hiện một số thay đổi nhỏ để làm cho nó hoạt động.
Đây là mã:
Tôi đã sử dụng ý tưởng @Graeme về việc sử dụng văn bản có thể mở rộng.
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);
Phương pháp màu ngẫu nhiên:
private int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
Thử cái này:
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
Sử dụng lớp SpannableBuilder thay vì định dạng HTML nếu có thể vì nó nhanh hơn phân tích định dạng HTML. Xem điểm chuẩn của riêng tôi "SpannableBuilder vs HTML" trên Github Cảm ơn!
Câu trả lời tuyệt vời! Tôi đã có thể sử dụng Spannable để xây dựng văn bản màu cầu vồng (vì vậy điều này có thể được lặp lại cho bất kỳ mảng màu nào). Đây là phương pháp của tôi, nếu nó giúp được ai:
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;
}
Và sau đó tôi chỉ cần setText (buildRainboxText (pack_name)); Lưu ý rằng tất cả các từ tôi chuyển qua đều dưới 15 ký tự và điều này chỉ lặp lại 5 màu 3 lần - bạn muốn điều chỉnh màu sắc / độ dài của mảng để sử dụng!
if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(String, flag) // for 24 API and more
} else {
Html.fromHtml(String) // or for older API
}
cho 24 API trở lên (cờ)
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;
Vì API 24, bạn có TỪ KHÓA_OPTION_USE_CSS_COLORS để bạn có thể xác định màu trong CSS thay vì lặp lại mọi lúc với font color="
Rõ ràng hơn - khi bạn có một số html và bạn muốn làm nổi bật một số thẻ được xác định trước - bạn chỉ cần thêm đoạn CSS ở đầu html
25 tháng 6 năm 2020 bởi @canerkaseler
Tôi muốn chia sẻ câu trả lời của 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
}
Sau, gọi chức năng trên. Bạn có thể gọi nhiều hơn một:
setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)
Đầu ra: Bạn có thể thấy gạch chân và màu sắc khác nhau với nhau.
@canerkaseler