调用canvas.drawtext时软键盘获取NullPointerException

时间:2013-10-19 09:53:57

标签: key label android-softkeyboard multiline

  

我正在使用SoftKeyboard,我需要在键上显示文本   由红色块显示如下

enter image description here

根据in this referencethis reference,我使用下面的代码,

 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
        }
    }
  

我的堆栈跟踪如下所示

     

&GT;致命异常:主要是java.lang.NullPointerException   com.example.android.softkeyboard.CandidateView.onDraw(CandidateView.java:240)   在   com.example.android.softkeyboard.CandidateView.setSuggestions(CandidateView.java:279)   在   com.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)at   android.os.Looper.loop(Looper.java:153)at   android.app.ActivityThread.main(ActivityThread.java:5000)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:511)at   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)

     

我已经检查过调试代码时画布总是为null,所以   我认为由于canvas为null,我得到了这个异常。

     

所以我得到了这个异常,因为canvas是null或问题所在   其他任何地方。

     

还有一件事我也尝试过使用popupCharacters和这个   正在工作,但我需要键上3个字符,如下所示,

enter image description here

  

这就是为什么我要尝试用画布上的油漆,但得到   异常。

3 个答案:

答案 0 :(得分:1)

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

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

如果canvas为null,您可以避免调用父项,但是不能以不同方式处理其余代码?至少,我会将其余的代码放在这个条件块中,当canvas为null时,不允许任何事情发生。

答案 1 :(得分:1)

通过错误在我的课程中扩展View类。所以当我使用 LatinKeyboard 解决我的问题时,我扩展了KeyboardView

答案 2 :(得分:0)

无需绘制,有一种简单的方法可以实现这一目标。See detail here