安卓SDK自定义键盘,设置背景和文本颜色:一键



这是我的代码:

公共类CustomKeyboardView扩展KeyboardView{

    public CustomKeyboardView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paintBackground = new Paint();
        paintBackground.setTextAlign(Paint.Align.CENTER);
        paintBackground.setTextSize(48);
        paintBackground.setColor(Color.YELLOW);

        List<Key> keys = getKeyboard().getKeys();
        for(Key key: keys) {
            if(key.label != null && key.codes[0] == 110)
                canvas.drawRect(key.x, key.y, key.x+key.width, key.y+key.height, paintBackground);
                paintBackground.setColor(Color.WHITE);
                canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                        key.y + (key.height / 2), paintBackground);
        }
    }

}

奇怪的是,如果我注释掉canvas drawRect或canvas draw Text,另一个效果很好,但如果我把它们都放在里面,我会得到这个错误:

        FATAL EXCEPTION: main Process: com.alpha.alphaproto, PID: 6540
    java.lang.NullPointerException
        at com.alpha.alphaproto.CustomKeyboardView.onDraw(CustomKeyboardView.java:48)
        at android.view.View.draw(View.java:14465)
        at android.view.View.getDisplayList(View.java:13362)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.View.draw(View.java:14182)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
        at android.view.View.getDisplayList(View.java:13357)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.View.draw(View.java:14182)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
        at android.view.View.draw(View.java:14468)
        at android.widget.FrameLayout.draw(FrameLayout.java:472)
        at android.view.View.getDisplayList(View.java:13362)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.View.draw(View.java:14182)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
        at android.view.View.getDisplayList(View.java:13357)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.View.draw(View.java:14182)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
        at android.view.View.draw(View.java:14468)
        at android.widget.FrameLayout.draw(FrameLayout.java:472)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2326)
        at android.view.View.getDisplayList(View.java:13362)
        at android.view.View.getDisplayList(View.java:13404)
        at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570)
        at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2377)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2249)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1879)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:544)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        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:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method

我很困惑。任何帮助都将不胜感激。

这是一个修改。以上代码在这两种情况下都不起作用。这是drawText或drawRect工作的代码,但不能一起工作:

    Paint paintBackground = new Paint();
    paintBackground.setTextAlign(Paint.Align.CENTER);
    paintBackground.setTextSize(48);
    paintBackground.setColor(Color.YELLOW);
    Paint paint = new Paint();
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTextSize(48);
    paint.setColor(Color.BLACK);
    List<Key> keys = getKeyboard().getKeys();
    for(Key key: keys) {
        if(key.label != null && key.codes[0] == 110)
            //canvas.drawText(key.label.toString(), key.x + (key.width/2), key.y + 25, paint);
            canvas.drawRect(key.x, key.y, key.x+key.width, key.y+key.height, paintBackground);
            canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                    key.y + (key.height / 2), paint);
    }

我修复了它。缺少一个括号。

最新更新