自定义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)
}
}
}