1

にテキストを書き込もうとしていますCanvas。テキストを書き込むためにソフト キーボードを表示する必要があるためEditText、幅 0 の をアクティビティに追加しました。に入力されたテキストを取得する TextWatcher も実装しましたEditText。このトリックを使用すると、次のコードでいつでもソフト キーボードを表示できます。

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(myEditText, InputMethodManager.SHOW_IMPLICIT);

このように、私はユーザーが何を書いているかを知り、私の中にテキストを書くことができますCanvas.

さて...これは、ユーザーが書くのをやめたいとき(または、キャンバス内のテキストを確実に固定したいとき)にトリッキーになります。私が思ったのは、彼が「Enter」を押すことができるということです。そこで、重要なイベントをキャッチする方法を実装しようとしました。これまでのところ成功なし。

これが私の実際のコードです。このメソッドは、書き込みを開始したいときに呼び出されます。「編集」はEditText.

public void handleUp(final Paint myPaint) {
                edit.setFocusable(true);
                edit.setFocusableInTouchMode(true);
                edit.requestFocus();
                edit.addTextChangedListener(new Watcher());
                edit.setImeOptions(EditorInfo.IME_ACTION_GO);
                edit.setOnEditorActionListener(new OnEditorActionListener() {
                    public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                        Log.d("MyApp", "key pressed");
                        Paint localPaint = new Paint();
                        mCanvas.drawText(edit.getText().toString(), mX, mY, localPaint);
                        return false;
                    }
                });
                edit.setOnKeyListener(new OnKeyListener() {
                    public boolean onKey(View v, int keyCode, KeyEvent event) {

                        Log.d("MyApp", "key pressed");
                        if (keyCode == KeyEvent.ACTION_DOWN) {
                            Paint localPaint = new Paint();
                            mCanvas.drawText(edit.getText().toString(), mX, mY, localPaint);
                            return true;
                        }
                        return false;
                    }
                });
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(edit, InputMethodManager.SHOW_IMPLICIT);

            }

アプリをデバッグすると、設定したチェック ポイントに到達Log()せず、ログにもメッセージが表示されません。この種の実装が使用されている StackOverFlow に関する多くの投稿を見てきましたが、ここで失敗する理由がわかりません。

ありがとうございました

4

3 に答える 3

0

ドキュメントから取得:

public void setOnKeyListener (View.OnKeyListener l)
Added in API level 1
Register a callback to be invoked when a hardware key is pressed in this view. Key presses    in software input methods will generally not trigger the methods of this listener.

したがって、別のリスナーを探す必要があります。

私の最善の推測は、これを使用することです:

public void setOnEditorActionListener (TextView.OnEditorActionListener l)
Added in API level 3
Set a special listener to be called when an action is performed on the text view. This   will be called when the enter key is pressed, or when an action supplied to the IME is selected by the user. Setting this means that the normal hard key event will not insert a newline into the text view, even if it is multi-line; holding down the ALT modifier will, however, allow the user to insert a newline character.

しかし、ドキュメントで見ることができる方法のどれも、ソフトキー入力について何も言及していませんでした.

于 2013-04-02T20:34:30.623 に答える
-1

さて、最終的に何も機能しなかった理由EditTextは、幅が 0 だったからです。幅と高さを 1 にするとView.INVISIBLE、この場合、可視性を設定しても機能しません。

ちなみに、3 つのリスナー (OnEditorActionListener、OnKeyListener、Overriding dispatchKeyEvent) がコールバックを取得します。しかしOnEditorActionListener、コールバックを 1 つだけ取得するのは 1 つだけなので、これを使用します。他の 2 つは、問題のあるいくつかのコールバックを受け取ります。

于 2013-04-03T11:13:21.177 に答える