2017-07-07 5 views
1

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?

Antwort

1

Abhängig von der Tastatur werden nicht alle Schlüssel über die InputConnection gesendet. Einige werden wie Hardkeys gesendet und müssen separat verarbeitet werden. Dazu gehören die Nummernblocknummern auf der Standardtastatur. Nach meinem besten Wissen ist die Verwendung des OnKeyListener wie du es getan hast (aber siehe @ pskinks Kommentare here).

Sie können die Textzeichen von den Steuerzeichen mit KeyEvent.getUnicodeChar() wie unten gezeigt trennen.

if (keyEvent.getUnicodeChar() != 0) { 
    // unicode text 
    char unicodeChar = (char) keyEvent.getUnicodeChar(); 
} else { 
    // control char 
} 

die Steuercodes Griff, die Sie benötigen, aber alle gültigen Unicode-Zeichen (einschließlich Zahlen und die neue Zeile (Enter) Zeichen) wird gefangen werden.

Ich behandle einige Aspekte davon in den Fragen und Antworten, die ich geschrieben habe, während ich mich darauf vorbereite, diese Frage zu beantworten.

I aktualisiert auch my previous answer über benutzerdefinierte Ansichten Tastatureingabe zu empfangen.

+0

ein großes Problem, das ich bekam, ist Tastaturereignisse fangen auf Samsung-Telefonen nicht. Bist du auf dieses Problem gestoßen? – Gorets

+0

@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

+0

Beschreibt dies Ihr Problem? https://StackOverflow.com/Questions/4282214/onkeylistener-not-working-on-virtual-keyboard – Suragch

Verwandte Themen