Android EditText监听粘贴事件、输入法的粘贴

自定义EditText

长按粘贴的监听以及修改

//重写 onTextContextMenuItem方法
    override fun onTextContextMenuItem(id: Int): Boolean {
        if (id == R.id.paste) {
            //调用剪贴板
            val clip: ClipboardManager =
                context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

            clip.primaryClip?.let {
                if (it.itemCount > 0) {
                    val input = it.getItemAt(0).coerceToText(context).toString().replace(" ", "")
                //进行判断 是否需要修改剪贴板内容            
                if (isPhone(input)) {//设置修改内容
                        val clipData = ClipData.newPlainText(input, input)
                        clip.setPrimaryClip(clipData)
                    }             
                }
            } 
        }
        return super.onTextContextMenuItem(id)
    }

输入法上的快捷粘贴

输入法和EditText通讯使用InputConnection

自定义InputConnectionWrapper

class InputConnection(
        target: android.view.inputmethod.InputConnection?,
        mutable: Boolean,
        val changeText: (String) -> Boolean
    ) :
        android.view.inputmethod.InputConnectionWrapper(
            target, mutable
        ) {

        override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
    
            val content = text.toString().replace(" ", "")
            if (changeText.invoke(content)) {
              //拦截并自己设置文案
                return true
            }
          //true 拦截修改
            return super.commitText(text, newCursorPosition)
        }

    }

全代码


@SuppressLint("AppCompatCustomView")
class GoEditText(context: Context?, attrs: AttributeSet?) : EditText(context, attrs) {
    


    override fun onTextContextMenuItem(id: Int): Boolean {
        if (id == R.id.paste) {
            //调用剪贴板
            val clip: ClipboardManager =
                context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

            clip.primaryClip?.let {
                if (it.itemCount > 0) {
                    val input = it.getItemAt(0).coerceToText(context).toString().replace(" ", "")
                    if (isPhone(input)) {
                        val clipData = ClipData.newPlainText(input, input)
                        clip.setPrimaryClip(clipData)
                    }


                }
            }
        }
        return super.onTextContextMenuItem(id)
    }

    private fun isPhone(text: String): Boolean {
        val match = "0?(13|14|15|18)[0-9]{9}"
        val pattern: Pattern = Pattern.compile(match)
        val matcher: Matcher = pattern.matcher(text)
        return matcher.matches()
    }

    val changeText: (String) -> Boolean = {
        if (isPhone(it)) {
            setText(it)
            setSelection(it.length)
            true
        } else {
            false
        }
    }

    override fun onCreateInputConnection(outAttrs: EditorInfo?): InputConnection {
        return InputConnection(super.onCreateInputConnection(outAttrs), false, changeText)
    }

    class InputConnection(
        target: android.view.inputmethod.InputConnection?,
        mutable: Boolean,
        val changeText: (String) -> Boolean
    ) :
        android.view.inputmethod.InputConnectionWrapper(
            target, mutable
        ) {

        override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {

            val content = text.toString().replace(" ", "")
            if (changeText.invoke(content)) {
                return true
            }

            return super.commitText(text, newCursorPosition)
        }

    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。