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.onDraw(CandidateView.java:240) の main java.lang.NullPointerException 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 で。com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) の IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:158) 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): トレース ファイルを開く際のエラー: そのようなファイルまたはディレクトリはありません (2)android.os.Handler.dispatchMessage(Handler.java:99) の handleMessage(HandlerCaller.java:61) 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(ネイティブ メソッド) 10-19 13:26:04.844: E/Trace(17693 ): トレース ファイルを開く際のエラー: そのようなファイルまたはディレクトリはありません (2)android.os.Handler.dispatchMessage(Handler.java:99) の handleMessage(HandlerCaller.java:61) 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(ネイティブ メソッド) 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) dalvik.system.NativeStart.main(ネイティブ メソッド) 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) dalvik.system.NativeStart.main(ネイティブ メソッド) 10-19 13:26:04.844: E/Trace(17693): トレース ファイルを開く際のエラー: そのようなファイルまたはディレクトリはありません (2)

コードをデバッグしているときにキャンバスが常にnullであることを確認したので、キャンバスがnullであるためにこの例外が発生していると思います。

したがって、キャンバスがnullであるか、問題が他の場所にあるため、この例外が発生しています。

さらにもう1つ、popupCharactersを使用してみましたが、これは機能していますが、以下に示すようにキーに3文字が必要です。

ここに画像の説明を入力

そのため、キャンバスにペイントしようとしていますが、例外が発生しています。

4

3 に答える 3

1

誤って、クラスで View クラスを拡張しています。それで、私の問題を解決するLatinKeyboardで作業しているので、 KeyboardViewを拡張しました。

于 2013-10-29T06:07:34.447 に答える
0

描画する必要はありません。これを実現する簡単な方法があります。詳細はこちらを参照してください

于 2014-12-17T14:06:21.100 に答える