2

我正在开发 SoftKeyboard,我需要在键上显示文本,如下所示的红色块

在此处输入图像描述

本参考资料本参考资料中所述,我使用以下代码,

 protected void onDraw(Canvas canvas) {
        if (canvas != null) {
            super.onDraw(canvas);
        }

        Paint paint = new Paint();
        paint.setTextSize(15);
        paint.setColor(Color.RED);

        int x2 = 0;
        int y2 = 0;
        int width = 0;
        List<Key> keys = SoftKeyboard.currentKeyboard.getKeys();
        for(Key key: keys) {
        if(key.codes[0] == 113)
            x2 = key.x; // value of x2 = 0;
            y2 = key.y; // value of y2 = 0;
            width = key.width; // value of width = 32;
            canvas.drawText("1", x2 + (width/2), y2 + 5, paint); // getting null pointer exception here line 240
        }
    }

我的堆栈跟踪如下所示

> 致命异常:com.example.android.softkeyboard.CandidateView.setSuggestions(CandidateView.java:279) 的 com.example.android.softkeyboard.CandidateView.onDraw(CandidateView.java:240) 的主要 java.lang.NullPointerException .example.android.softkeyboard.SoftKeyboard.setSuggestions(SoftKeyboard.java:597) 在 com.example.android.softkeyboard.SoftKeyboard.updateCandidates(SoftKeyboard.java:582) 在 com.example.android.softkeyboard.SoftKeyboard.onFinishInput(SoftKeyboard .java:260) 在 android.inputmethodservice.InputMethodService.doFinishInput(InputMethodService.java:1543) 在 android.inputmethodservice.InputMethodService.doStartInput(InputMethodService.java:1552) 在 android.inputmethodservice.InputMethodService$InputMethodImpl.startInput(InputMethodService.java: 390) 在 android.inputmethodservice。IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:158) 在 com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os .Looper.loop(Looper.java:153) 在 android.app.ActivityThread.main(ActivityThread.java:5000) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke (Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 在 dalvik。 system.NativeStart.main(Native Method) 10-19 13:26:04.844: E/Trace(17693): error opening trace file: No such file or directory (2)handleMessage(HandlerCaller.java:61) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:153) 在 android.app.ActivityThread.main(ActivityThread.java :5000) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit .java:821) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) at dalvik.system.NativeStart.main(Native Method) 10-19 13:26:04.844: E/Trace(17693 ):打开跟踪文件时出错:没有这样的文件或目录(2)handleMessage(HandlerCaller.java:61) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:153) 在 android.app.ActivityThread.main(ActivityThread.java :5000) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit .java:821) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) at dalvik.system.NativeStart.main(Native Method) 10-19 13:26:04.844: E/Trace(17693 ):打开跟踪文件时出错:没有这样的文件或目录(2)lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit. java:584) at dalvik.system.NativeStart.main(Native Method) 10-19 13:26:04.844: E/Trace(17693): 打开跟踪文件时出错:没有这样的文件或目录 (2)lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit. java:584) at dalvik.system.NativeStart.main(Native Method) 10-19 13:26:04.844: E/Trace(17693): 打开跟踪文件时出错:没有这样的文件或目录 (2)

我在调试代码时检查了画布始终为空,所以我认为由于画布为空而出现此异常。

因此,由于画布为空或问题出在其他任何地方,我得到了这个异常。

还有一件事我也尝试过使用 popupCharacters 并且这是有效的,但我需要 3 个字符在键上,如下所示,

在此处输入图像描述

这就是为什么我试图在画布上绘画但得到例外。

4

3 回答 3

1

显然canvas是作为 null 传递的。问题是从哪里调用您发布的函数。这也可能给您带来问题:

if (canvas != null) {
    super.onDraw(canvas);
}

如果 canvas 为空,您避免调用父级,但您不会以不同的方式处理其余代码?至少,我会将你的其余代码放在这个条件块中,当画布为空时,什么都不会发生。

于 2013-10-28T18:34:22.763 回答
1

错误地在我的课堂上扩展了 View类。因此,我在使用LatinKeyboard时扩展了 KeyboardView ,这解决了我的问题。

于 2013-10-29T06:07:34.447 回答
0

无需绘制它,有一种简单的方法可以实现这一点..请参阅此处的详细信息

于 2014-12-17T14:06:21.100 回答