Skip to content

Commit 747b273

Browse files
committed
1,增加HtmlTextView
1 parent 8abbb5a commit 747b273

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.flyjingfish.formattextview
2+
3+
import android.content.Context
4+
import android.graphics.Color
5+
import android.text.Html
6+
import android.text.SpannableStringBuilder
7+
import android.text.method.LinkMovementMethod
8+
import android.text.style.ClickableSpan
9+
import android.text.style.URLSpan
10+
import android.text.util.Linkify
11+
import android.util.AttributeSet
12+
import android.view.View
13+
import androidx.appcompat.widget.AppCompatTextView
14+
15+
class HtmlTextView : AppCompatTextView {
16+
private var onHtmlClickListener: OnHtmlClickListener? = null
17+
private var isClickSpanItem = false
18+
constructor(context: Context?) : super(context)
19+
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
20+
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
21+
context,
22+
attrs,
23+
defStyleAttr
24+
)
25+
26+
fun setHtmlText(htmlText: String) {
27+
setHtmlText(htmlText, false)
28+
}
29+
30+
fun setHtmlText(htmlText: String, isDeleteWrap: Boolean) {
31+
text = setClickableHtml(htmlText, isDeleteWrap)
32+
highlightColor = Color.TRANSPARENT
33+
autoLinkMask = Linkify.WEB_URLS
34+
}
35+
36+
private fun setClickableHtml(webText: String, isDeleteWrap: Boolean): CharSequence? {
37+
val spanned = Html.fromHtml(webText)
38+
var htmlBuilder = SpannableStringBuilder(spanned)
39+
if (isDeleteWrap) {
40+
htmlBuilder = deleteLines(htmlBuilder)
41+
}
42+
val spans = htmlBuilder.getSpans(
43+
0, spanned.length,
44+
URLSpan::class.java
45+
)
46+
for (i in spans.indices) {
47+
val span = spans[i]
48+
setSpanClickable(htmlBuilder, span)
49+
}
50+
return htmlBuilder
51+
}
52+
53+
private fun setSpanClickable(htmlBuilder: SpannableStringBuilder, urlSpan: URLSpan) {
54+
val start = htmlBuilder.getSpanStart(urlSpan)
55+
val end = htmlBuilder.getSpanEnd(urlSpan)
56+
val flags = htmlBuilder.getSpanFlags(urlSpan)
57+
val clickableSpan: ClickableSpan = object : ClickableSpan() {
58+
override fun onClick(widget: View) {
59+
val url = urlSpan.url
60+
if (onHtmlClickListener != null) {
61+
onHtmlClickListener!!.onLabelClick(url)
62+
isClickSpanItem = true
63+
}
64+
}
65+
}
66+
htmlBuilder.setSpan(clickableSpan, start, end, flags)
67+
}
68+
69+
fun deleteLines(spannableStringBuilder: SpannableStringBuilder): SpannableStringBuilder {
70+
val length = spannableStringBuilder.length
71+
for (i in 0 until length) {
72+
val ch = spannableStringBuilder[i]
73+
if (ch == '\r' || ch == '\n') {
74+
return deleteLines(spannableStringBuilder.delete(i, i + 1))
75+
}
76+
}
77+
return spannableStringBuilder
78+
}
79+
80+
81+
interface OnHtmlClickListener {
82+
fun onLabelClick(url: String?)
83+
}
84+
85+
override fun setOnClickListener(l: OnClickListener?) {
86+
super.setOnClickListener { v: View? ->
87+
if (!isClickSpanItem && l != null) {
88+
l.onClick(this@HtmlTextView)
89+
}
90+
isClickSpanItem = false
91+
}
92+
}
93+
94+
fun setOnHtmlClickListener(onHtmlClickListener: OnHtmlClickListener?) {
95+
movementMethod = LinkMovementMethod.getInstance()
96+
this.onHtmlClickListener = onHtmlClickListener
97+
}
98+
}

app/src/main/java/com/flyjingfish/formattextviewdemo/MainActivity.kt

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.flyjingfish.formattextviewdemo
33
import android.graphics.drawable.Drawable
44
import androidx.appcompat.app.AppCompatActivity
55
import android.os.Bundle
6+
import android.util.Log
67
import android.widget.Toast
78
import com.bumptech.glide.Glide
89
import com.bumptech.glide.RequestBuilder
@@ -12,6 +13,7 @@ import com.bumptech.glide.request.transition.Transition
1213
import com.flyjingfish.FormatTexttextview.FormatText
1314
import com.flyjingfish.formattextview.FormatImage
1415
import com.flyjingfish.formattextview.FormatTextView
16+
import com.flyjingfish.formattextview.HtmlTextView
1517
import com.flyjingfish.formattextview.OnFormatClickListener
1618
import kotlinx.android.synthetic.main.activity_main.*
1719

@@ -101,7 +103,14 @@ class MainActivity : AppCompatActivity() {
101103
}
102104

103105

106+
text7.setHtmlText("哈哈哈<a>lala</a>啦啦<a href=\"haha\">haha</a>哈哈哈<img src=\"url_test\"></img>");
107+
text7.setOnHtmlClickListener(object :HtmlTextView.OnHtmlClickListener{
108+
override fun onLabelClick(url: String?) {
109+
Toast.makeText(this@MainActivity,"onClick-Html"+url,Toast.LENGTH_SHORT).show()
110+
text7.setHtmlText("哈哈哈<a>lala</a>啦啦<a href=\"haha\">haha</a>哈哈哈<img src=\"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp0.itc.cn%2Fq_70%2Fimages03%2F20210227%2F6687c969b58d486fa2f23d8488b96ae4.jpeg&refer=http%3A%2F%2Fp0.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1661701773&t=19043990158a1d11c2a334146020e2ce\"></img>");
104111

112+
}
105113

114+
});
106115
}
107116
}

app/src/main/res/layout/activity_main.xml

+8
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,13 @@
4242
android:lineSpacingExtra="20dp"
4343
android:text="Hello World!" />
4444

45+
<com.flyjingfish.formattextview.HtmlTextView
46+
android:id="@+id/text7"
47+
android:layout_width="wrap_content"
48+
android:layout_height="wrap_content"
49+
android:textSize="20sp"
50+
android:lineSpacingExtra="20dp"
51+
android:text="Hello World!" />
52+
4553

4654
</LinearLayout>

settings.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
include ':FormatTextView'
22
include ':app'
3-
rootProject.name = "FormatTextViewDemo"
3+
rootProject.name = "FormatTextViewLib"

0 commit comments

Comments
 (0)