23

我不明白为什么这段代码不起作用。仅检测退格键和返回键。侦听器不会为任何其他键触发。我的设备是 Nexus One。

我试图覆盖活动的 OnKeyDown 方法,这更糟。唯一检测到的按钮是硬件后退按钮。

我看到了使用 TextWatcher 和 onTextChanged 的​​建议,虽然这在某些情况下可能有效,但这并不是真正的解决方法。例如,如果文本框为空,则不会检测到用户是否按下 BackSpace(Delete) 按钮。那么有什么想法吗?

        TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            makeToast(keyCode + " key pressed");
            return true;
        }
    });
4

6 回答 6

19

行。我终于想出了如何做我想做的事,我对 Android 并不为此感到自豪。

我正在编写服务器/客户端应用程序,在客户端上我必须打开 SoftKeyboard 并发送按下的键(字符和 DEL 键)......每次按下键时,该字符都会发送到服务器。如果按下 DEL,我将向服务器发送序列 {BS}。

为了做到这一点,我必须实现 TextWatcher 和 onTextChange ,除了 EditText 为空且用户按下 DEL 键的情况外,它们运行良好。由于 EditText 没有变化,因此无法检测到按下 DEL 键。

除了 TextWatcher,我还必须实现附加到 EditText 控件的 onKeyListener。这个 onKeyListener 忽略 SoftKeyboard 上的所有键,除了 DEL 和 RETURN。不知道为什么?也许是一个错误?

这是我的代码:

    TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.addTextChangedListener(inputTextWatcher);

    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d(TAG, keyCode + " character(code) to send");
            return false;
        }
    });

和 TextWatcher....

private TextWatcher inputTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) { }
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
        { }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, s.charAt(count-1) + " character to send");;          
    }
};
于 2010-11-26T20:32:14.403 回答
4

你在这里犯了一个错误。
它应该return true,如果你处理了这个事件。如果你想让事件由下一个接收者处理return false
你总是返回 true

于 2010-11-26T04:35:27.357 回答
4

注意:输入类型在您的编辑文本中提及。

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences|textAutoCorrect" >



edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });
于 2015-03-19T07:21:59.370 回答
3

您是否尝试过为该视图使用特定的侦听器子类?

我对 EditText 也有类似的问题。下面的代码有效:

private OnKeyListener keyListener = new EditText.OnKeyListener(){

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        EditText et = (EditText) v;
        Log.i("APPEVENT", "Key hit: "+ event);
        //...
        return false;
    }

};

但是如果我使用View.OnKeyListener,我只记录退格键并输入。可能是类似的问题TextView。也许子类键侦听器对给定子View类的更多事件敏感。

于 2013-02-07T13:32:28.597 回答
2

参考自:

http://developer.android.com/reference/android/view/View.OnKeyListener.html

View.OnKeyListener

类概述 将硬件按键事件分派到此视图时要调用的回调的接口定义。将在将键事件提供给视图之前调用回调。这仅对硬件键盘有用;软件输入法没有义务触发这个监听器。

似乎 OnKeyListener 仅适用于硬件键!

于 2019-09-10T10:31:19.197 回答
0

我们在 iPhone 上也遇到了 TextWatcher 问题——如果缓冲区为空,键盘不会发送 del 事件。我们通过预加载 1000 个字符的键盘缓冲区来解决这个问题。幸运的是,我们的应用程序将编辑字段隐藏在键盘后面,因此看不到 1000 个字符。这很丑,但它有效(除非用户在输入任何数据之前连续点击 1000 次删除!)

于 2011-01-05T05:23:43.997 回答