Ich habe meine individuelle Pin-Code-AnsichtEingangsanschluss für numerischen Typ Tastatur
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
}
}
Das Problem kommt, wenn Sie
outAttrs.inputType = InputType.TYPE_CLASS_NUMBER
in diesem Fall
InputConnection
doesn festlegen möchten 't handnummern- getEditable() feuert nicht
commitText() nicht ausgelöst
so wurde meine Abhilfe nur Umgang betäubt in setOnKeyListener wie Sie oben sehen können.
Weiß jemand, was das Problem ist?
ein großes Problem, das ich bekam, ist Tastaturereignisse fangen auf Samsung-Telefonen nicht. Bist du auf dieses Problem gestoßen? – Gorets
@Gorets, ich bin noch nicht auf dieses Problem gestoßen, aber ich habe kein Samsung-Handy, um es zu testen. Das ist schlecht. Also die Zahlen, löschen und eingeben funktionieren nicht? Bitte lassen Sie es mich wissen, sobald Sie eine Lösung gefunden haben. Ich werde das auch mehr untersuchen. – Suragch
Beschreibt dies Ihr Problem? https://StackOverflow.com/Questions/4282214/onkeylistener-not-working-on-virtual-keyboard – Suragch