1

我正在尝试在Canvas. 由于我需要显示软键盘来编写文本,我EditText在我的 Activity 中添加了一个宽度为 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 回答
0

您覆盖 dispatchKeyEvent 以获取 Enter 键

@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
    {
        // Do whatever you want
    }

    return super.dispatchKeyEvent(event);
}
于 2013-04-02T21:47:24.150 回答
-1

好的,所以最后没有任何效果的原因是因为我EditText的宽度为 0。当我将宽度和高度设置为 1 时View.INVISIBLE。在这种情况下将可见性设置为不起作用。

顺便说一句,三个 Listener(OnEditorActionListener、OnKeyListener 和 Overriding dispatchKeyEvent)获取回调。但我会使用OnEditorActionListener,因为它是唯一一个只有一个回调的。另外两个有几个回调,这是有问题的。

于 2013-04-03T11:13:21.177 回答