我已经从下面的链接中完成了多行文字支持 Dotted underline TextView not wrapping to the next line using SpannableString in Android
将方向肖像更改为横向后,虚线下划线移至其他位置
我在清单中添加了“ android:configChanges =“ orientation”“,以防止在创建调用时使用。
<activity android:name=".Main2Activity"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
setAnnotation(
spannableString,
"production and conversion"
)
答案 0 :(得分:0)
请参考您在此问题中提到的原始问题,并假设您使用的是原始问题中的“ DottedUnderlineSpan”,则需要进行以下更改:
注释跨度已替换为 ReplacementSpans ,一旦您自己处理方向更改,就必须对其进行显式重新计算。设置注释范围后,请勿将其删除。它们将在方向更改时保持有效。
ReplacementSpans 将需要更改。更改方向后,请移除替换跨度,继续进行布局,然后重新计算 ReplacementSpans ,如以下代码所示,
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val textView1 = findViewById<TextView>(R.id.textView1)
removeUnderlineSpans(textView1)
textView1.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
textView1.viewTreeObserver.removeOnPreDrawListener(this)
replaceAnnotations(textView1)
return false
}
}
)
}
private fun removeUnderlineSpans(textView: TextView) {
val text = textView.text as Spannable
val spans = text.getSpans(0, text.length, DottedUnderlineSpan::class.java)
spans.forEach { span ->
text.removeSpan(span)
}
textView.setText(text, TextView.BufferType.SPANNABLE)
}
private fun replaceAnnotations(textView: TextView) {
val text = SpannableString(textView.text)
val spans =
text.getSpans(0, text.length, Annotation::class.java).filter { span ->
span.key == ANNOTATION_FOR_UNDERLINE
}
if (spans.isNotEmpty()) {
val layout = textView.layout
spans.forEach { span ->
replaceAnnotationSpan(text, span, layout)
}
textView.setText(text, TextView.BufferType.SPANNABLE)
}
}