繁体   English   中英

onKeyListener无法在虚拟键盘上工作

[英]onKeyListener not working on virtual keyboard

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

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

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

        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;
        }
    });

好。 我终于想到了如何做我想做的事情,我并不为Android感到骄傲。

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

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

除了TextWatcher之外,我还必须实现onKeyListener,它附加到我的EditText控件。 此onKeyListener忽略除了DEL和RETURN之外的SoftKeyboard上的所有键。 不知道为什么? 可能有一个bug?

这是我的代码:

    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");;          
    }
};

你这里犯了一个错误。
它应该return true ,如果你处理了这个事件。 如果要允许事件由下一个接收器处理 ,则return false
你总是回归真实

注意:在edittext中提及输入类型。

<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;
            }
        });

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

我有一个与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子类的更多事件敏感。

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

参考来自:

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

View.OnKeyListener

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

似乎OnKeyListener仅为HARDWARE键设计!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM