Helpex - Trao đổi & giúp đỡ Đăng nhập
676

Tôi có HTML đơn giản :

<h2>Title</h2><br>
<p>description here</p>

Tôi muốn hiển thị văn bản theo kiểu HTML TextView. làm như thế nào?

676 hữu ích 3 bình luận 510k xem chia sẻ
18 trả lời 18
1211

Bạn cần sử dụng Html.fromHtml()để sử dụng HTML trong Chuỗi XML của mình. Chỉ cần tham chiếu một Chuỗi có HTML trong bố cục của bạn XML sẽ không hoạt động.

Đây là những gì bạn nên làm:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
1211 hữu ích 5 bình luận chia sẻ
67

setText (Html.fromHtml (bodyData)) đang bị phản đối sau khi api 24. Bây giờ bạn phải làm điều này:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
      tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
 } else {
      tvDocument.setText(Html.fromHtml(bodyData));
 }
67 hữu ích 0 bình luận chia sẻ
61

Hãy xem cái này: https://stackoverflow.com/a/8558249/450148

Nó cũng khá tốt !!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

Nó chỉ hoạt động cho một vài thẻ.

61 hữu ích 5 bình luận chia sẻ
39

Nếu bạn muốn có thể định cấu hình nó thông qua xml mà không cần sửa đổi gì trong mã java, bạn có thể thấy ý tưởng này hữu ích. Đơn giản là bạn gọi init từ constructor và đặt văn bản là html

public class HTMLTextView extends TextView {
    ... constructors calling init...
    private void init(){
       setText(Html.fromHtml(getText().toString()));
    }    
}

xml:

        <com.package.HTMLTextView
        android:text="@string/about_item_1"/>
39 hữu ích 0 bình luận chia sẻ
22

Các mã dưới đây đã cho kết quả tốt nhất cho tôi.

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
22 hữu ích 1 bình luận chia sẻ
19

Nếu bạn đang cố gắng hiển thị HTML từ id tài nguyên chuỗi, định dạng có thể không hiển thị trên màn hình. Nếu điều đó đang xảy ra với bạn, hãy thử sử dụng thẻ CDATA thay thế:

strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>

...

MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));

Xem bài đăng này để biết thêm chi tiết.

19 hữu ích 1 bình luận chia sẻ
12
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
    SiteLink= (TextView) findViewById(R.id.textViewSite);
    SiteLink.setText(Html.fromHtml(value));
    SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
12 hữu ích 3 bình luận chia sẻ
11

Nếu bạn chỉ muốn hiển thị một số văn bản html và không thực sự cần a TextView, thì hãy lấy WebViewvà sử dụng nó như sau:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

Điều này cũng không giới hạn bạn trong một vài thẻ html.

11 hữu ích 2 bình luận chia sẻ
10

Điều đáng nói là phương thức Html.fromHtml (Nguồn chuỗi) không được dùng cho cấp API 24. Nếu đó là API mục tiêu của bạn, bạn nên sử dụng Html.fromHtml (Nguồn chuỗi, cờ int) .

10 hữu ích 0 bình luận chia sẻ
10

Cách tiếp cận tốt nhất để sử dụng các phần CData cho chuỗi trong tệp String.xml để hiển thị thực tế nội dung html cho TextView đoạn mã dưới đây sẽ cho bạn ý tưởng hợp lý.

//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>

//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));

Phần CData trong văn bản chuỗi giữ nguyên dữ liệu thẻ html ngay cả sau khi định dạng văn bản bằng phương thức String.format. Vì vậy, Html.fromHtml (str) hoạt động tốt và bạn sẽ thấy văn bản in đậm trong thông điệp Chào mừng.

Đầu ra:

Chào mừng bạn đến cửa hàng ứng dụng âm nhạc yêu thích của bạn. Đăng nhập với tên: tên người dùng

10 hữu ích 2 bình luận chia sẻ
6

Tôi cũng muốn đề xuất dự án sau: https://github.com/NightWhistler/HtmlSpanner

Cách sử dụng gần giống như trình chuyển đổi Android mặc định:

(new HtmlSpanner()).fromHtml()

Tìm thấy nó sau khi tôi đã bắt đầu bằng cách triển khai html sang trình chuyển đổi có thể mở rộng, bởi vì Html.fromHtml tiêu chuẩn không cung cấp đủ tính linh hoạt đối với kiểm soát kết xuất và thậm chí không có khả năng sử dụng phông chữ tùy chỉnh từ ttf

6 hữu ích 1 bình luận chia sẻ
5

Sử dụng đơn giản Html.fromHtml("html string"). Điều này sẽ làm việc. Nếu chuỗi có các thẻ như <h1>thì không gian sẽ đến. Nhưng chúng ta không thể loại bỏ những không gian đó. Nếu bạn vẫn muốn xóa khoảng trắng, thì bạn có thể xóa các thẻ trong chuỗi và sau đó chuyển chuỗi sang phương thức Html.fromHtml("html string");. Ngoài ra, nhìn chung các chuỗi này đến từ máy chủ (động) nhưng không thường xuyên, nếu đó là trường hợp tốt hơn để truyền chuỗi vì nó là phương thức hơn là cố gắng loại bỏ các thẻ khỏi chuỗi.

5 hữu ích 0 bình luận chia sẻ
4
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
4 hữu ích 0 bình luận chia sẻ
3

Tôi đã thực hiện điều này bằng cách sử dụng xem web. Trong trường hợp của tôi, tôi phải tải hình ảnh từ URL cùng với văn bản trong chế độ xem văn bản và điều này làm việc cho tôi.

WebView myWebView =new WebView(_context);
        String html = childText;
        String mime = "text/html";
        String encoding = "utf-8";
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
3 hữu ích 1 bình luận chia sẻ
3

Thực hiện một phương pháp toàn cầu như:

public static Spanned stripHtml(String html) {
            if (!TextUtils.isEmpty(html)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
                } else {
                    return Html.fromHtml(html);
                }
            }
            return null;
        }

Bạn cũng có thể sử dụng nó trong Activity / Fragment của mình như:

text_view.setText(stripHtml(htmlText));
3 hữu ích 0 bình luận chia sẻ
3

Tôi biết câu hỏi này là cũ. Câu trả lời khác ở đây gợi ý Html.fromHtml()phương pháp. Tôi đề nghị bạn sử dụng HtmlCompat.fromHtml()từ android.support.v4.text.HtmlCompatgói. Vì đây là phiên bản tương thích ngược của Htmllớp.

Mã mẫu:

import android.support.v4.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;

String htmlString = "<h1>Hello World!</h1>";

Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);

TextView tvOutput = (TextView) findViewById(R.id.text_view_id);

tvOutput.setText(spanned);

Bằng cách này, bạn có thể tránh kiểm tra phiên bản API của Android và thật dễ sử dụng (giải pháp một dòng).

3 hữu ích 3 bình luận chia sẻ
2

Nó đã được đề xuất thông qua các câu trả lời khác nhau để sử dụng lớp khung Html như được đề xuất ở đây, nhưng thật không may, lớp này có hành vi khác nhau trong các phiên bản khác nhau của Android và các lỗi không được giải quyết khác nhau, như đã được trình bày trong các vấn đề 214637 , 14778 , 23512875953 .

Do đó, bạn có thể muốn sử dụng thư viện tương thích để chuẩn hóa và nhập lại lớp Html trên các phiên bản Android, bao gồm nhiều cuộc gọi lại cho các thành phần và kiểu dáng:

Dự án Github HtmlCompat

Mặc dù tương tự như lớp Html của khung công tác, một số thay đổi chữ ký được yêu cầu để cho phép nhiều cuộc gọi lại hơn. Đây là mẫu từ trang GitHub:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
//        imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
2 hữu ích 1 bình luận chia sẻ
2

Bất cứ khi nào bạn viết tùy chỉnh xem văn bản, tính năng văn bản của bộ HTML sẽ bị biến mất dưới dạng một số thiết bị.

Vì vậy, chúng ta cần làm theo các bước bổ sung sau đây là công việc

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}
2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android html xml-parsing android-textview , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading