1
我做了我的PIN代码视图输入连接
class StarsPasswordView : LinearLayout {
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
init(context, attrs)
}
val passwordHolder = SpannableStringBuilder()
var count
fun init(context: Context, attrs: AttributeSet?) {
orientation = HORIZONTAL
isFocusable = true
isFocusableInTouchMode = true
gravity = Gravity.CENTER
val attr = context.obtainStyledAttributes(attrs, R.styleable.StarsPasswordView, 0, 0)
count = attr.getInteger(R.styleable.StarsPasswordView_count, 4)
attr.recycle()
drawView(count)
setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
if (event.action == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_ENTER)
[email protected] true
if (keyCode == KeyEvent.KEYCODE_BACK)
[email protected] false
if (keyCode == KeyEvent.KEYCODE_DEL) {
clear()
get(0).requestFocus()
} else
if (passwordHolder.length != count) {
passwordHolder.append(event.number)
val position = passwordHolder.length
select(position - 1)
if (position < count)
get(position).requestFocus()
else {
passwordFilled?.invoke(passwordHolder.toString())
}
}
[email protected] true
}
false
})
}
fun samsungWorkaround() {
val position = passwordHolder.length
select(position - 1)
if (position == count)
passwordFilled?.invoke(passwordHolder.toString())
}
}
// toggle whether the keyboard is showing when the view is clicked
override fun onTouchEvent(event: MotionEvent): Boolean {
if (enableKeyboard && event.action == MotionEvent.ACTION_UP) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
return true
}
override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
outAttrs.inputType = InputType.TYPE_CLASS_NUMBER
return InputConnection(this, true)
}
}
class InputConnection internal constructor(val targetView: StarsPasswordView, fullEditor: Boolean) : BaseInputConnection(targetView, fullEditor) {
override fun getEditable(): Editable {
return targetView.passwordHolder
}
override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
val res = super.commitText(text, newCursorPosition)
targetView.samsungWorkaround()
return res
}
}
当你想设置
outAttrs.inputType = InputType.TYPE_CLASS_NUMBER
在这种情况下,问题就来了
InputConnection
没有按't处理数字- getEditable()不会触发
commitText()不会触发
所以我的解决方法只是处理setOnKeyListener中的麻烦,如上所示。
有谁知道这个问题是什么?
我得到的一个大问题是键盘事件在三星手机上没有捕捉到。你遇到过这个问题吗? – Gorets
@戈雷茨,我还没有遇到这个问题,但我没有三星手机来测试它。那很糟。所以数字,删除和输入不起作用?请尽快通知我们解决方案。我也会更多地考虑这一点。 – Suragch
这是否描述你的问题? https://stackoverflow.com/questions/4282214/onkeylistener-not-working-on-virtual-keyboard – Suragch