Có thể có nhiều kiểu trong TextView không?


547

Có thể đặt nhiều kiểu cho các đoạn văn bản khác nhau trong TextView không?

Chẳng hạn, tôi đang thiết lập văn bản như sau:

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

Có thể có một phong cách khác nhau cho mỗi yếu tố văn bản? Ví dụ: dòng1 đậm, chữ in nghiêng, v.v.

Các tác vụ chung của Hướng dẫn dành cho nhà phát triển và Cách thực hiện chúng trong Android bao gồm Chọn, tô sáng hoặc Tạo kiểu cho các phần văn bản :

// 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);

Nhưng điều đó sử dụng số vị trí rõ ràng bên trong văn bản. Có cách nào sạch hơn để làm điều này?


6
Nếu chuỗi TextView là tĩnh, bạn chỉ cần thêm các thẻ html <b>, <i> và <u> vào tệp tài nguyên chuỗi và chúng sẽ tự động được áp dụng. Ví dụ như <TextView android: text = "@ string / test" /> nơi @ chuỗi / thử nghiệm được đặt thành <string> <b> đậm </ b>, <i> nghiêng </ i> </ string>
greg7gkb

2
+1 @ greg7gkb! Từ khóa là 'tĩnh.' Tôi đang nhổ tóc tự hỏi tại sao một số chuỗi của tôi hoạt động với <b> và một số thì không. Những cái không có biến trong đó.
Scott Bigss

Câu trả lời:


694

Trong trường hợp, bất cứ ai cũng tự hỏi làm thế nào để làm điều này, đây là một cách: (Cảm ơn Mark một lần nữa!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

Để biết danh sách các thẻ không chính thức được hỗ trợ bởi phương pháp này, hãy tham khảo liên kết này hoặc câu hỏi này: Thẻ HTML nào được Android TextView hỗ trợ?


1
@ JānisGruzis: Có lẽ một cách để làm điều này là thông qua một phương thức còn sơ khai, formatTextWhite(string text)chỉ cần chèn văn bản vào chuỗi định dạng sau : "<font size="..." color="..." face="...">%s</font>".
Truyền thuyết

@Legend tôi đã sử dụng <font fgcolor = '# ffff5400'> <b> <big> "+" Title "+" </ big> </ b> </ font> nhưng fgcolor / color (cả hai đã thử) không làm việc ... bạn có biết làm thế nào để làm điều màu sắc bằng cách sử dụng html
Muhammad Babar

@MuhammadBabar: Bạn có thể thử cái này Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");không? Tôi nhớ điều này đôi khi làm việc cho tôi. Không chắc chắn nếu nó vẫn hoạt động.
Truyền thuyết

1
@Legend cảm ơn nhưng có một cách xung quanh nó Html.fromHtml("<font color=\"#999999\">các chuỗi thoát đã làm việc cho tôi :) ...
Muhammad Babar

2
Tại sao điều này không hoạt động mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);bất kỳ ý tưởng nào cảm ơn
Shan Xeeshi

216

Hãy thử Html.fromHtml()và đánh dấu văn bản của bạn bằng các thẻ HTML in đậm và in nghiêng, ví dụ:

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

1
Trên thực tế điều đó đưa tôi đến một câu hỏi khác: tốt hơn là có một textview với văn bản html bên trong nó hoặc ba chế độ xem văn bản với thiết lập đánh dấu khác nhau mà không cần sử dụng lớp html? Tôi đang giả sử nó rõ ràng là cái đầu tiên nhưng chỉ muốn xác nhận nó ...
Truyền thuyết

2
Tôi không biết danh sách đầy đủ các thẻ mà Html.fromHtml () hỗ trợ - bạn sẽ cần xem mã nguồn. Đánh dấu nội tuyến và nhiều tiện ích TextView phải là quyết định trực giao. Sử dụng nhiều widget nếu bạn cần vị trí chính xác của các đoạn văn bản rời rạc. Sử dụng đánh dấu nội tuyến nếu bạn, ừm, cần đánh dấu nội tuyến trong một widget. Hãy nhớ rằng: không có FlowLayout trong Android, do đó, việc xâu chuỗi nhiều TextView để tạo một đoạn văn không thực sự là AFAIK.
CommonsWare

1
Cảm ơn vì điều đó ... Trên thực tế, thẻ <small> đã hoạt động ... Vì vậy, tôi sẽ giữ nó đơn giản và chỉ sử dụng nó ...
Truyền thuyết

1
@TimBoland: Bạn đang vứt bỏ các nhịp của mình thông qua monthText + " " + month.getYearLabel(). Xem StringUtils.concat().
CommonsWare

2
@TimBoland: Bạn có thể làm tất cả trong một : monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b>&nbsp;"+month.getYearLabel())), nếu bạn không cần các phần riêng lẻ.
CommonsWare

191

Hơi lạc đề, nhưng tôi thấy điều này quá hữu ích không được đề cập ở đây.

Điều gì sẽ xảy ra nếu chúng ta muốn đọc văn bản Html từ tài nguyên chuỗi XML và do đó giúp dễ dàng bản địa hóa. CDATA làm cho điều này có thể:

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

Từ mã Java của chúng tôi, bây giờ chúng tôi có thể sử dụng nó như thế này:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

Tôi không mong đợi điều này sẽ làm việc. Nhưng nó đã làm.

Hy vọng nó hữu ích cho một số bạn!


2
Thông thường "sai" ngụ ý rằng bạn đã truy cập một giá trị lạ trên bảng tra cứu. Tôi đã nhận được điều này khi tôi có R.id.ok và R.opes.ok và vô tình sử dụng getString (R.id.ok) thay vì getString chính xác (R.opes.ok)
Joe Plante

Cái này có hoạt động theo bố cục - XML ​​không? Khi tôi đề cập đến tài nguyên chuỗi ở đó với "@string/someText"(trong đó "someText" là tài nguyên được xác định trong một chuỗi tệp), tôi chỉ lấy chuỗi có tất cả các thẻ HTML dưới dạng 'văn bản'.
Gee.E

3
Tôi thấy đây là câu trả lời tốt nhất. Truyền cảm hứng cho tôi. Không thể không đặt câu trả lời đáng giá hai xu của tôi. Giải pháp tại đây gist.github.com/aegis1980/b138dcb2fd1b2e98aa30 cho phép bạn chỉ định trong tệp bố cục để bạn không cần gán tài nguyên văn bản theo chương trình (và có thể xem trước trong Android Studio!)
Jon

127

Nếu bạn không cảm thấy thích sử dụng html, bạn có thể tạo một tệp kiểu và sử dụng nó như thế này:

TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

sao chép / dán nó vào một ứng dụng Android đơn giản mà bạn có thể đang làm việc. Bạn sẽ thấy rằng trên một textview duy nhất, hai kiểu sẽ được áp dụng.
Kent Andersen

xin lỗi tôi đã không rõ ràng nếu bạn phải chỉ định chuỗi con (thông qua hai chỉ mục) về nơi áp dụng kiểu, thì điều đó không hiệu quả đối với các chuỗi cục bộ bởi vì các chỉ mục tất nhiên sẽ khác nhau đối với mọi miền.
Jeffrey Blattman

Bạn nói đúng. Nếu bạn đang hỗ trợ nhiều ngôn ngữ, đây sẽ không phải là con đường bạn muốn đi. Trừ khi bạn chắc chắn chuỗi sẽ không thay đổi kích thước ... chẳng hạn như tên ứng dụng chẳng hạn.
Kent Andersen

9
Tôi không thấy lý do tại sao l10n không thể làm việc với giải pháp này. Chỉ cần nhận các chuỗi riêng biệt thay vì chỉ một: Chuỗi FirstPart = getString (R.opes.line1); Chuỗi secondPart = getString (R.opes.line2); Spannable text = new SpannableString (FirstPart + secondPart); text.setSpan (PremgroundColorSpan mới myTextView.setText (văn bản, TextView.BufferType.SPANNABLE);
Rùa

5
@Rui vì l10n cũng có vị trí. bạn không thể mã hóa vị trí của các từ trong cụm từ và vẫn là l10n. đó là lý do tại sao bạn thấy những thứ như $1%s is a happy $2%strong các chuỗi chuỗi. bạn phải cho phép các mã thông báo được sắp xếp lại.
Jeffrey Blattman

60

Nó là trọng lượng nhẹ hơn để sử dụng SpannableStringthay vì đánh dấu html. Nó giúp tôi xem các ví dụ trực quan vì vậy đây là một câu trả lời bổ sung.

nhập mô tả hình ảnh ở đây

Đây là một đơn TextView.

// set the text
SpannableString s1 = new SpannableString("bold\n");
SpannableString s2 = new SpannableString("italic\n");
SpannableString s3 = new SpannableString("foreground color\n");
SpannableString s4 = new SpannableString("background color\n");
SpannableString s5 = new SpannableString("underline\n");
SpannableString s6 = new SpannableString("strikethrough\n");
SpannableString s7 = new SpannableString("bigger\n");
SpannableString s8 = new SpannableString("smaller\n");
SpannableString s9 = new SpannableString("font\n");
SpannableString s10 = new SpannableString("URL span\n");
SpannableString s11 = new SpannableString("clickable span\n");
SpannableString s12 = new SpannableString("overlapping spans\n");

// set the style
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
s11.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
    }
}, 0, s11.length(), flag);
s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
s12.setSpan(new UnderlineSpan(), 4, 11, flag);

// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
builder.append(s5);
builder.append(s6);
builder.append(s7);
builder.append(s8);
builder.append(s9);
builder.append(s10);
builder.append(s11);
builder.append(s12);

// set the text view with the styled text
textView.setText(builder);
// enables clicking on spans for clickable span and url span
textView.setMovementMethod(LinkMovementMethod.getInstance());

Học cao hơn

Ví dụ này ban đầu được lấy cảm hứng từ đây .


5
Bài đăng của bạn tốt hơn Tài liệu Google về SpannableString .. Cảm ơn bạn
MBH

Đã hỗ trợ hình ảnh này từ dịch vụ web. Yêu cầu của tôi như thế.
MohanRaj S

@MohanRajS SpannableStrings hỗ trợ biểu tượng cảm xúc Unicode, nhưng không phải hình ảnh khác.
Suragch

@Suragch cảm ơn bạn đã phản hồi nhanh chóng, nhưng yêu cầu phụ của tôi là jpg, png. Lựa chọn duy nhất để xử lý là webview? :(
MohanRaj S

43

Danh sách các thẻ được hỗ trợ là:

Nếu bạn sử dụng tài nguyên chuỗi, bạn có thể thêm một số kiểu đơn giản, chẳng hạn như in đậm hoặc in nghiêng bằng cách sử dụng ký hiệu HTML. Các thẻ hiện được hỗ trợ là: B(đậm), I(in nghiêng), U(gạch dưới), TT(monospace), BIG, SMALL, SUP(superscript), SUB(subscript), và STRIKE(gạch ngang). Vì vậy, ví dụ, trong res/values/strings.xmlbạn có thể tuyên bố điều này:

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

(Từ http://developer.android.com/guide/faq/commont task.html # selectingtext - Liên kết Lưu trữ web, <resource>lỗi chính tả là bản gốc!)

Nó cũng cho thấy rằng Html.fromHtmlkhông thực sự cần thiết trong các trường hợp đơn giản.


Html.fromHtml thường là một cách dễ dàng hơn để tạo kiểu văn bản. Ngoài ra, liên kết này đã có trong câu hỏi ban đầu.
Mâu thuẫn

17

Tôi đã chạy vào cùng một vấn đề. Tôi có thể sử dụng fromHtml, nhưng bây giờ tôi là Android, không phải web, vì vậy tôi quyết định dùng thử. Tôi phải bản địa hóa điều này mặc dù vậy tôi đã cho nó một shot bằng khái niệm thay thế chuỗi. Tôi đặt kiểu trên TextView là kiểu chính, sau đó chỉ định dạng các mẫu khác.

Tôi hy vọng điều này sẽ giúp những người khác muốn làm điều tương tự - tôi không biết tại sao điều này không dễ dàng hơn trong khuôn khổ.

Chuỗi của tôi trông như thế này:


<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

Dưới đây là các phong cách:


<style name="MainStyle">
    <item name="android:textSize">@dimen/regular_text</item>
    <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
    <item name="android:textSize">@dimen/paragraph_bullet</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

Đây là mã của tôi gọi phương thức formatStyles của tôi:


SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

Phương thức định dạng:


private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    {
        value = value.replace(tag1, sub1);
    }

    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    {
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return styledText;
}

Tôi không nghĩ rằng nó sẽ hoạt động nếu một phiên bản được bản địa hóa của chuỗi sắp xếp lại {0} và {1}. Bạn có thể phải thay đổi startLocation0 nếu startLocation1 là <startLocation0
JonathanC


8

Đây là một cách dễ dàng để làm như vậy bằng HTMLBuilder

    myTextView.setText(new HtmlBuilder().
                    open(HtmlBuilder.Type.BOLD).
                    append("Some bold text ").
                    close(HtmlBuilder.Type.BOLD).
                    open(HtmlBuilder.Type.ITALIC).
                    append("Some italic text").
                    close(HtmlBuilder.Type.ITALIC).
                    build()
    );

Kết quả:

Một số văn bản in đậm Một số văn bản in nghiêng


7

Nếu bạn muốn có thể thêm văn bản theo kiểu trong xml, bạn có thể tạo chế độ xem tùy chỉnh mở rộng TextView và ghi đè setText ():

public class HTMLStyledTextView extends TextView
{
    public HTMLStyledTextView(Context context) {
        super(context);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type)
    {
       super.setText(Html.fromHtml(text.toString()), type);
    }
}

Sau đó, bạn có thể sử dụng nó như thế này (thay thế PACKAGE_NAMEbằng tên gói của bạn):

<PACKAGE_NAME.HTMLStyledTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="<![CDATA[
        <b>Bolded Text:</b> Non-Bolded Text
    ]]>"
/>

Liệu nó có xem trước trong Android Studio đúng cách không?
JPM


3

Tôi cũng vậy

Làm thế nào về việc sử dụng một số đánh dấu đẹp với Kotlin và Anko -

import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
    title = "Created with Beautiful Markup"
    super.onCreate(savedInstanceState)

    verticalLayout {
        editText {
            hint = buildSpanned {
                append("Italic, ", Italic)
                append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
                append(", Bold", Bold)
            }
        }
    }
}

Được tạo bằng Markup đẹp


2

Có, nó có thể sử dụng SpannedString. Nếu bạn đang sử dụng Kotlin, việc sử dụng trở nên dễ dàng hơn core-ktxvì nó cung cấp ngôn ngữ dành riêng cho tên miền (DSL) để thực hiện việc này:

    val string: SpannedString = buildSpannedString {
        bold {
            append("1111")
        }
        append("Devansh")     
    }

Các tùy chọn khác được cung cấp bởi nó là:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

Cuối cùng, bạn có thể chỉ để:

textView.text = string

0

Trong thực tế, ngoại trừ đối tượng Html, bạn cũng có thể sử dụng các lớp loại Spannable, ví dụ: TextAppparentSpan hoặc typefaceSpan và SpannableString togather. Lớp Html cũng sử dụng các cơ chế này. Nhưng với các lớp loại Spannable, bạn sẽ tự do hơn.


0

Nó có thể đơn giản như tận dụng phương thức length () của String:

  1. Chia chuỗi văn bản trong tệp XML Chuỗi thành nhiều chuỗi con (một chuỗi riêng biệt theo quan điểm của Android) như nhiều bạn cần các kiểu khác nhau, vì vậy nó có thể giống như: str1, str2, str3 (như trong trường hợp của bạn), mà khi nối với nhau là toàn bộ chuỗi đơn bạn sử dụng.

  2. Và sau đó chỉ cần làm theo phương pháp "Span", giống như bạn đã trình bày với mã của mình - nhưng thay vì một chuỗi, kết hợp tất cả các chuỗi con hợp nhất chúng thành một chuỗi duy nhất, mỗi chuỗi có một kiểu tùy chỉnh khác nhau.

Tuy nhiên, bạn vẫn sử dụng các số, tuy nhiên không trực tiếp - hiện tại chúng không còn ở dạng mã hóa cứng (như trong mã của bạn), nhưng chúng được thay thế bằng các phương thức độ dài () kết hợp (lưu ý hai ngôi sao trước và ghi vào str. length () thay cho số tuyệt đối để kéo dài sự thay đổi):

str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

đối với kích thước chuỗi đầu tiên, sau đó str.length () + 1, str.length () + str2.length () cho kích thước chuỗi thứ hai, v.v. với tất cả các chuỗi con, thay vì 0,7 hoặc 8,19 và như thế...


0

Sử dụng Lớp Spannable phụ trợ làm tài nguyên Chuỗi Android chia sẻ ở cuối trang web. Bạn có thể tiếp cận điều này bằng cách tạo CharSquencesvà tạo cho họ một phong cách.

Nhưng trong ví dụ họ đưa ra cho chúng tôi, chỉ dành cho chữ in đậm, in nghiêng và thậm chí tô màu văn bản. Tôi cần phải bọc một vài kiểu CharSequenceđể đặt chúng vào TextView. Vì vậy, với Class đó (tôi đặt tên cho nó CharSequenceStyles) tôi chỉ cần thêm chức năng này.

public static CharSequence applyGroup(LinkedList<CharSequence> content){
    SpannableStringBuilder text = new SpannableStringBuilder();
    for (CharSequence item : content) {
        text.append(item);
    }
    return text;
}

Và trong quan điểm tôi đã thêm điều này.

            message.push(postMessageText);
            message.push(limitDebtAmount);
            message.push(pretMessageText);
            TextView.setText(CharSequenceStyles.applyGroup(message));

Tôi hy vọng điều này sẽ giúp bạn!


0

Spanny làm cho SpannableString dễ sử dụng hơn.

Spanny spanny = new Spanny("Underline text", new UnderlineSpan())
                .append("\nRed text", new ForegroundColorSpan(Color.RED))
                .append("\nPlain text");
textView.setText(spanny)

0

Như Jon đã nói , đối với tôi đây là giải pháp tốt nhất và bạn không cần thiết lập bất kỳ văn bản nào khi chạy, chỉ sử dụng lớp tùy chỉnh HtmlTextView này

public class HtmlTextView extends TextView {

  public HtmlTextView(Context context) {
      super(context);
  }

  public HtmlTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
  }

  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) 
  {
      super(context, attrs, defStyleAttr);
  }

  @TargetApi(21)
  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
  }

  @Override
  public void setText(CharSequence s,BufferType b){
      super.setText(Html.fromHtml(s.toString()),b);
  }

}

và đó là nó, bây giờ chỉ đưa nó vào XML của bạn

<com.fitc.views.HtmlTextView
    android:id="@+id/html_TV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_html" />

với Chuỗi Html của bạn

<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.