改变方向后点划线位置改变

时间:2019-10-16 06:52:18

标签: android textview spannablestring

我已经从下面的链接中完成了多行文字支持 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"
        )

肖像: enter image description here

风景: enter image description here

1 个答案:

答案 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)
    }
}