ClassCastException:android.inputmethodservice.KeyboardView无法转换为com.support.mukhtar.simplekeyboard.CustomKeyboardView android

我有SimpleIME.kt类为了实现简单的InputMethodEditor和做我的自定义键盘在android上:

class SimpleIME : InputMethodService(), OnKeyboardActionListener { private var kv: CustomKeyboardView? = null private var keyboard: Keyboard? = null companion object{ const val TAG :String = "myLogs" } private var caps = false override fun onCreateInputView(): View? { kv = layoutInflater.inflate(R.layout.keyboard, null) as CustomKeyboardView keyboard = Keyboard(this, R.xml.qwerty) kv!!.keyboard = keyboard kv!!.setOnKeyboardActionListener(this) Log.d(TAG,"onCreateInputView") return kv } ... } 

和我的CustomKeuboardView类如下:

 class CustomKeyboardView : KeyboardView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) override fun onKeyMultiple(keyCode: Int, repeatCount: Int, event: KeyEvent?): Boolean { return super.onKeyMultiple(keyCode, repeatCount, event) } override fun onTouchEvent(me: MotionEvent?): Boolean { Log.d(TAG,"onTouchEvent "+me.toString()) return super.onTouchEvent(me) } } 

它抛出classCastException如下所示:

  java.lang.ClassCastException: android.inputmethodservice.KeyboardView cannot be cast to com.support.mukhtar.simplekeyboard.CustomKeyboardView at com.support.mukhtar.simplekeyboard.SimpleIME.onCreateInputView(SimpleIME.kt:30) at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1248) at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:1669) at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:1636) at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:497) at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:202) at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5426) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) at dalvik.system.NativeStart.main(Native Method) 

如果我实现SimpleIME.kt类如下:

 class SimpleIME : InputMethodService(), OnKeyboardActionListener { private var kv: KeyboardView? = null private var keyboard: Keyboard? = null companion object{ const val TAG :String = "myLogs" } private var caps = false override fun onCreateInputView(): View? { kv = layoutInflater.inflate(R.layout.keyboard, null) as KeyboardView keyboard = Keyboard(this, R.xml.qwerty) kv!!.keyboard = keyboard kv!!.setOnKeyboardActionListener(this) Log.d(TAG,"onCreateInputView") return kv } ... } 

它工作正常,但我需要在KeyboardView实现onTouchEvent为了处理多个点击,所以我认为有必要实现CustomKeyboardView类; 有一个用java写的CustomKeyboardView的例子: https : //github.com/blackcj/AndroidCustomKeyboard.git请帮助

我的问题不是这样的: java.lang.ClassCastException:android.inputmethodservice.KeyboardView无法转换为android.view.ViewGroup

因为layout.xml存在一个问题,但是我没有任何问题,因为它可以工作,如果我像之前所示的那样使用KeyboardView

我的layout.keyboard.xml文件:

 <?xml version="1.0" encoding="UTF-8"?> <android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="#3Aad1a" android:keyPreviewLayout ="@layout/preview" /> 

只需将android.inputmethodservice.KeyboardView替换为R.layout.keyboard xml文件中的CustomKeyboardView