Sử dụng HTML trong TextViews có thể hữu ích cho việc định dạng, đặc biệt là khi hiển thị nội dung được truy xuất từ máy chủ. Để có bố cục tối ưu và kiểm soát bố cục gốc tùy chỉnh – XML hoặc lập trình được ưu tiên hơn, tuy nhiên, sử dụng HTML trong TextView có thể mang lại cho bạn kết quả nhanh chóng, trong khi vẫn duy trì cảm giác và giao diện của ứng dụng gốc. Đây là mọi thứ bạn cần biết
Để hiển thị HTML trong TextView, hãy sử dụng lớp
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]4. Điều này tạo ra một đối tượng Spanned mà TextView có thể hiển thị
val html = """Hello World""" textView.text = Html.fromHtml[html]
Những gì được hỗ trợ
Các thẻ này được hỗ trợ với
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]4phông chữemtth1pciteah2uldfnuh3liidelh4divbigsh5spansmallstrikeh6strongphông chữupimgbblockquotesubbr
Differences in supported tags in Android versions.
- &
- elements will be separated from other texts with one newline character by default.
public static final int FROM_HTML_OPTION_USE_CSS_COLORS
4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
94Flag indicating that texts inside
elements will be separated from other texts with one newline character by default.
public static final int FROM_HTML_OPTION_USE_CSS_COLORS
4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
96Option for
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
97: Wrap consecutive lines of text delimited by '\n' insideelements.
public static final int FROM_HTML_OPTION_USE_CSS_COLORS
4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
99Option for
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
97: Wrap each line of text delimited by '\n' inside aor a
- element.
Phương thức công khai
class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
01class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
02Trả về một biểu diễn thoát HTML của văn bản thuần nhất đã cho
class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
03class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
04Trả về văn bản theo kiểu có thể hiển thị từ chuỗi HTML được cung cấp
class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
03class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
06Phương pháp này không được dùng trong API cấp 24. sử dụng
public static final int FROM_HTML_OPTION_USE_CSS_COLORS
6 thay thếclass HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
03class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
09Trả về văn bản theo kiểu có thể hiển thị từ chuỗi HTML được cung cấp
class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
03val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]
01Phương pháp này không được dùng trong API cấp 24. sử dụng
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]
02 thay thếclass HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
01val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]
04Trả về một biểu diễn HTML của văn bản Spanned được cung cấp. Nỗ lực tốt nhất được thực hiện để thêm các thẻ HTML tương ứng với các nhịp. Cũng lưu ý rằng các siêu ký tự HTML [chẳng hạn như "
- were added in Nougat [API 23] – possibly other differences.
tùy chỉnh
Nếu hỗ trợ sẵn dùng cho HTML không đáp ứng nhu cầu của bạn, Android sẽ cho phép tùy chỉnh – có giới hạn. Khi xây dựng chuỗi từ HTML, chúng tôi có thể cung cấp một
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]6
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }
Và sau đó chuyển một thể hiện tới `Html. phương thức fromHtml`
textView.setText[Html.fromHtml[html, null, MyTagHandler[]]]
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]6 chỉ được cung cấp các thẻ mà hệ thống không hỗ trợ – thẻ này có thể khác nhau tùy thuộc vào phiên bản Android
Cảnh báo trên là quan trọng. TagHandler chỉ giới hạn ở các thẻ mà phiên bản Android mà người dùng của bạn đang chạy hỗ trợ. Bạn muốn sử dụng danh sách hoặc danh sách có thứ tự? . Rất tiếc, không có phương tiện nào để ghi đè hành vi mặc định. Nếu bạn quyết tâm sử dụng HTML, cách tốt nhất của bạn - theo như tôi biết - là sử dụng thẻ tùy chỉnh, sau đó triển khai nó trong một
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]6
Rất may, có thư viện của bên thứ 3 cho phép ghi đè TẤT CẢ các thẻ. Xem bên dưới để biết chi tiết
Hỗ trợ bên thứ ba
Có một lib bên thứ 3 được duy trì mà tôi đã tìm thấy với một số hỗ trợ HTML phù hợp vượt xa TextView tích hợp. HtmlSpanner hỗ trợ nhiều thẻ hơn và có thể mở rộng. Nó cho phép bạn ghi đè TẤT CẢ các thẻ, vì vậy bạn có thể tùy chỉnh bất kỳ thẻ nào
Nó cho phép bạn ghi đè TẤT CẢ các thẻ, vì vậy bạn có thể tùy chỉnh bất kỳ thẻ nào
tôi trong bài
Với các thẻ xử lý HtmlSpanner như hình bên dưới
class HtmlTagNodeHandler[val wrappedHandler: TagNodeHandler] : TagNodeHandler[] { override fun handleTagNode[node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?] { //override any tag here - must register for each tag } }
val htmlSpanner = HtmlSpanner[] htmlSpanner.registerHandler["font", FontHandler[]] textView.setText[htmlSpanner.fromHtml[html]]
Bớt tư tưởng
TextView có thể được sử dụng với HTML, tuy nhiên hỗ trợ của nó bị hạn chế. Nếu bạn đang tìm hiểu về hỗ trợ HTML, bạn có thể có một câu hỏi lớn hơn về cách chúng tôi có thể chia sẻ mã/bố cục trên các nền tảng. Việc triển khai bố cục hơn 3 lần [Android, iOS, Web] là rất nhiều công việc và dù sao thì KHÔ nó cũng là một khoản tiết kiệm lớn. Đó là điều làm cho các giải pháp như Flutter trở nên hấp dẫn. Sử dụng HTML trong TextViews có thể là giải pháp một phần để chia sẻ một số nội dung/định dạng
Chia sẻ trên facebook
tiếng riu ríu
Về patjackson52
Kỹ sư phần mềm, chồng và cha của 2 đứa trẻ tuyệt vời. Đa nền tảng Android, iOS, Kotlin. Người duy trì ReduxKotlin. tổ chức
Cờ cho
public static final int FROM_HTML_OPTION_USE_CSS_COLORS6. Tách các phần tử cấp khối bằng ngắt dòng [ký tự dòng mới] ở giữa
public static final int FROM_HTML_OPTION_USE_CSS_COLORS4
public static final int FROM_HTML_OPTION_USE_CSS_COLORS8
Cờ cho
public static final int FROM_HTML_OPTION_USE_CSS_COLORS6. Tách các phần tử cấp khối bằng các dòng trống [hai ký tự dòng mới] ở giữa
public static final int FROM_HTML_OPTION_USE_CSS_COLORS4
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }01
Cờ cho biết nên sử dụng các giá trị màu CSS thay vì các giá trị được xác định trong
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }02
public static final int FROM_HTML_OPTION_USE_CSS_COLORS4
class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }04
Flag indicating that texts inside
elements will be separated from other texts with one newline character by default.public static final int FROM_HTML_OPTION_USE_CSS_COLORS4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }06Flag indicating that texts inside
elements will be separated from other texts with one newline character by default.public static final int FROM_HTML_OPTION_USE_CSS_COLORS4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }08Flag indicating that texts inside
~ elements will be separated from other texts with one newline character by default.
public static final int FROM_HTML_OPTION_USE_CSS_COLORS4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }90Flag indicating that texts inside
elements will be separated from other texts with one newline character by default.
public static final int FROM_HTML_OPTION_USE_CSS_COLORS4class MyTagHandler : TagHandler { override fun handleTag[opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader] { //do formatting/styling here } }92Flag indicating that texts inside
Chủ Đề