问题描述
按照标题,当我通过也删除选定范围后调用removeSpan(span)来删除范围时,也是如此。
这是课程。
package com.scitalys.ui
import android.content.Context
import android.graphics.Color
import android.text.*
import android.text.style.ForegroundColorSpan
import android.text.style.ImageSpan
import android.util.AttributeSet
import android.view.inputmethod.EditorInfo
import android.widget.ArrayAdapter
import android.widget.MultiAutoCompleteTextView
import com.google.android.material.chip.ChipDrawable
import com.scitalys.bptraits.Trait
class MorphInputText @JvmOverloads constructor(
context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = R.attr.autoCompleteTextViewStyle
) : androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView(context,attrs,defStyleAttr) {
private val textWatcher = MorphInputTextWatcher(context)
private val traits: Array<String> = Trait.values().map {
it.toString()
}.toTypedArray()
private val autoCompleteAdapter =
ArrayAdapter<String>(context,R.layout.morph_input_dropdown,traits)
private val tokenizer = NoSpaceCommaTokenizer
init {
this.threshold = 2
this.addTextChangedListener(textWatcher)
this.setAdapter(autoCompleteAdapter)
this.setTokenizer(tokenizer)
this.inputType = EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS
this.inputType = EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
}
}
class MorphInputTextWatcher(private val context: Context) : TextWatcher {
private var spans: MutableList<ImageSpan> = mutablelistof()
private var commaAdded = false
private var commaDeleted = false
private var cursor = 0
private var startingToken = 0
private var endingToken = 0
private var leftBound = 10
override fun beforeTextChanged(charSequence: CharSequence,start: Int,count: Int,after: Int) {
cursor = start + count
commaDeleted = false
if (charSequence.isNotEmpty()) {
if (cursor != 0) {
commaDeleted = charSequence[cursor - 1] == ',' && after < count
}
}
}
override fun onTextChanged(charSequence: CharSequence,before: Int,count: Int) {
commaAdded = false
if (charSequence.isNotEmpty()) {
if (before < count) {
commaAdded = (charSequence[start + count - 1] == ',')
}
}
}
override fun afterTextChanged(editable: Editable) {
if (commaAdded) {
startingToken = 0
if (spans.isNotEmpty()) {
for (span in spans) {
if (cursor > editable.getSpanStart(span)) {
startingToken = editable.getSpanEnd(span)
}
}
}
endingToken = startingToken
for (c in editable.subSequence(startingToken,editable.length)) {
endingToken++
if (c == ',') {
break
}
}
val chip = ChipDrawable.createFromresource(context,R.xml.chip)
chip.text = editable.subSequence(startingToken,endingToken - 1)
chip.setBounds(leftBound,chip.intrinsicWidth + leftBound,chip.intrinsicHeight)
chip.setTextAppearanceResource(R.style.TextAppearance_App_StandaloneChip)
val span = PaddingImageSpan(chip,20)
editable.setSpan(
span,startingToken,endingToken,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
spans.add(span)
} else if (commaDeleted) {
for (span in spans) {
if (cursor <= editable.getSpanEnd(span)) {
editable.removeSpan(span)
spans.remove(span)
return
}
}
}
}
}
object NoSpaceCommaTokenizer : MultiAutoCompleteTextView.Tokenizer {
override fun findTokenStart(charSequence: CharSequence,cursor: Int): Int {
var i = cursor
while (i > 0 && charSequence[i - 1] != ',') {
i--
}
while (i < cursor && charSequence[i] == ',') {
i++
}
return i
}
override fun findTokenEnd(charSequence: CharSequence,cursor: Int): Int {
var i = cursor
val len = charSequence.length
while (i < len) {
if (charSequence[i] == ',') {
return i
} else {
i++
}
}
return len
}
override fun terminatetoken(charSequence: CharSequence): CharSequence {
var i = charSequence.length
while (i > 0 && charSequence[i - 1] == ',') {
i--
}
if (i > 0 && charSequence[i - 1] == ',') {
return charSequence
} else if (charSequence is Spanned) {
val sp = SpannableString("$charSequence,")
TextUtils.copySpansFrom(
charSequence,charSequence.length,Object::class.java,sp,0
)
return sp
}
return "$charSequence,"
}
}
有问题的部分在afterTextChanged()下的textWatcher中。 我相信removeSpan()调用只会被执行一次。
任何建议将不胜感激,谢谢。
编辑:我不知道这是否会有所帮助,但我注意到只有两个跨度相同时,它才会出错。文本可以相等或不相等,不会改变行为。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)