当我保留空间keylistener时,为什么我在为ViewGroup添加View时获得项目的灰色背景?

问题描述 投票:0回答:1

当我为此视图保留关键监听器时

edit_text.setOnKeyListener(keyListener)

空间键码

KeyEvent.KEYCODE_SPACE -> {
    if (listener != null && event.action == KeyEvent.ACTION_DOWN) {
        val text = edit_text.text
        if (text.isEmpty()) {
            return@OnKeyListener false
        }
        val startSelection = edit_text.selectionStart
        val endSelection = edit_text.selectionEnd

        if (startSelection < 0 || endSelection < 0) {
            return@OnKeyListener false
        }

        if (endSelection == startSelection) {
            val urlSpan = text.getSpans(0, startSelection, EditorUrlSpan::class.java)
            if (urlSpan?.isNotEmpty() == true) {
                val firstUrlSpan = urlSpan[0]
                val lastUrlSpan = urlSpan[urlSpan.size - 1]

                val firstStartIndex = text.getSpanStart(firstUrlSpan)
                val firstEndIndex = text.getSpanEnd(firstUrlSpan)
                val lastStartIndex = text.getSpanStart(lastUrlSpan)
                val lastEndIndex = text.getSpanEnd(lastUrlSpan)

                val character = when {
                    firstEndIndex < lastStartIndex -> text.subSequence(firstEndIndex, lastStartIndex)
                    firstStartIndex == lastStartIndex && firstEndIndex == lastEndIndex -> " "
                    else -> ""
                }
                when {
                    firstStartIndex == 0 && lastEndIndex >= endSelection && character == " " -> {
                        text.delete(lastStartIndex, lastEndIndex)
                        setText(text)
                        setSelection(length())
                        listener?.insertLink(this@KoalaEditTextView, lastUrlSpan.mLinkData.apply {
                            this.linkTitle = this.linkTitle?.replace("$href ", "")
                        })
                        return@OnKeyListener true
                    }

                    lastUrlSpan.mLinkData.linkTitle.isNullOrEmpty() -> {
                        sendParseUrlMessage(lastStartIndex, lastEndIndex, lastUrlSpan.mLinkData.linkUrl)
                        return@OnKeyListener true
                    }
                }

            }
        }
    }
    false
}

结束密钥代码

KeyEvent.KEYCODE_ENTER -> {
    if (listener != null && event.action == KeyEvent.ACTION_DOWN) {
        if (section == SECTION_NULL) {
            if (!quote) {
                listener!!.pressEnter(this@KoalaEditTextView)
                return@OnKeyListener true
            } else {
                val text = edit_text.text
                if (text.isEmpty()) {
                    setText("")
                    listener!!.pressEnter(this@KoalaEditTextView)
                    return@OnKeyListener true
                } else if (edit_text.selectionEnd == text.length && text.toString()[text.length - 1] == '\n') {
                    setText(text.subSequence(0, text.toString().length - 1))
                    setSelection(edit_text.length())
                    listener!!.pressEnter(this@KoalaEditTextView)
                    return@OnKeyListener true
                }
                if (edit_text.selectionStart == edit_text.selectionEnd && edit_text.selectionStart == 1
                    && text.toString()[0] == '\n') {
                    setText(text.subSequence(1, text.length))
                    listener!!.insertEdit(this@KoalaEditTextView)
                    return@OnKeyListener true
                }
            }
        } else {
            if (edit_text.text.toString().trim { it <= ' ' }.isEmpty()) {
                cleanSection(this@KoalaEditTextView)
                resetPosition()
                return@OnKeyListener true
            } else {
                listener!!.pressEnter(this@KoalaEditTextView)
                return@OnKeyListener true
            }
        }
        return@OnKeyListener false
    }
    true
}

和监听器insertLink和pressEnter

override fun insertLink(v: KoalaEditTextView, linkData: LinkData) {
    val index = container.indexOfChild(v)
    val linkView = KoalaLinkView(context, linkData)
    linkView.setOnLinkClickListener(itemLinkListener)
    val lpCard = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    container.addView(linkView, index + 1, lpCard)
    linkView.requestFocus()
    linkView.post {
        linkView.link_right_area.requestFocus()
        linkView.link_right_area.performClick()
    }
}

override fun pressEnter(v: KoalaEditTextView) {
    var leftSelectionText: CharSequence
    var rightSelectionText: CharSequence
    val index = container.indexOfChild(v)
    val startSelection = v.selectionStart
    val endSelection = v.selectionStart
    val txt = SpannableStringBuilder(v.obtainText())
    if (startSelection < v.length()) {
        leftSelectionText = txt.subSequence(0, if (startSelection > -1) {
            startSelection
        } else {
            0
        })
        rightSelectionText = txt.subSequence(if (startSelection > -1) {
            startSelection
        } else {
            0
        }, v.length())
    } else {
        leftSelectionText = txt
        rightSelectionText = ""
    }

    val urlSpan = txt.getSpans(0, startSelection, KoalaEditTextView.Companion.EditorUrlSpan::class.java)
    if (urlSpan?.isNotEmpty() == true) {
        val firstUrlSpan = urlSpan[0]
        val lastUrlSpan = urlSpan[urlSpan.size - 1]

        val firstStartIndex = txt.getSpanStart(firstUrlSpan)
        val firstEndIndex = txt.getSpanEnd(firstUrlSpan)
        val lastStartIndex = txt.getSpanStart(lastUrlSpan)
        val lastEndIndex = txt.getSpanEnd(lastUrlSpan)

        val character = when {
            firstEndIndex < lastStartIndex -> txt.subSequence(firstEndIndex, lastStartIndex)
            firstStartIndex == lastStartIndex && firstEndIndex == lastEndIndex -> "\n"
            else -> ""
        }
        when {
            firstStartIndex == 0 && startSelection > 0 && lastEndIndex >= endSelection && character == "\n" -> {
                txt.delete(lastStartIndex, lastEndIndex)
                v.setText(txt)
                v.setSelection(v.length())
                insertLink(v, lastUrlSpan.mLinkData.apply {
                    this.linkTitle = this.linkTitle?.replace("$href ", "")
                })
                return
            }

            lastUrlSpan.mLinkData.linkTitle.isNullOrEmpty() -> {
                v.sendParseUrlMessage(lastStartIndex, lastEndIndex, lastUrlSpan.mLinkData.linkUrl)
                return
            }

            endSelection > -1 && lastEndIndex > endSelection -> {
                leftSelectionText = txt.subSequence(0, lastStartIndex)
                rightSelectionText = txt.subSequence(lastStartIndex, v.length())
            }
        }
    }

    v.setText(leftSelectionText)
    val editTextView = KoalaEditTextView(context, this, menuStatusListener, contentListener)
    val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    container.addView(editTextView, index + 1, lp)
    editTextView.setText(rightSelectionText)
    editTextView.requestFocus()
    editTextView.setSelection(0)
    if (v.obtainSection() == SECTION_NUMBER) {
        editTextView.setNumberSection(editTextView)
    } else if (v.obtainSection() == SECTION_DOT) {
        editTextView.setDotSection(editTextView)
    }
    editTextView.resetPosition()
    setHint()
}

当我按空格键进入时,代码已经调用了

add view for space key

add view for enter key

调用相同的代码,空格键得到灰色bg,回车键不是the gray background

怎么解决这个?谢谢!

android kotlin keylistener
1个回答
0
投票

现在,我通过查看InputMethodService.class的android源代码解决了它

在我的代码中,我已经实现了InputConnectionWrapper来覆盖此代码的commitText

 override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
            return when {
                text?.toString() == "\n" -> sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER)
                text?.toString() == " " -> sendDownUpKeyEvents(KeyEvent.KEYCODE_SPACE)
                else -> super.commitText(text, newCursorPosition)
            }
        }

        private fun sendDownUpKeyEvents(keyCode: Int): Boolean {
            val eventTime = SystemClock.uptimeMillis()
            return sendKeyEvent(KeyEvent(eventTime, eventTime,
                KeyEvent.ACTION_DOWN, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE))
                && sendKeyEvent(KeyEvent(eventTime, eventTime,
                KeyEvent.ACTION_UP, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE))
        }

sendDownUpKeyEvents中发生了一些事情,这个bug发生在我使用过的地方

text?.toString()==“” - > sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_SPACE))&& sendKeyEvent(KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_SPACE))

我在KeyEvent.FLAG_KEEP_TOUCH_MODE的标志中读取KeyEvent.class构造函数params的原因对于这个bug更重要!

© www.soinside.com 2019 - 2024. All rights reserved.