onKeyListener不能在虚拟键盘上工作

我不明白为什么这段代码不工作。 只有退格键和返回键被检测到。 监听器不会为任何其他密钥启动。 我的设备是Nexus One。

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

我看到一个build议使用TextWatcher和onTextChanged,虽然这可能在某些情况下工作,这不是一个真正的工作。 例如,如果文本框为空,则不会检测用户是否按BackSpace(删除)button。 那么有什么想法?

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

Solutions Collecting From Web of "onKeyListener不能在虚拟键盘上工作"

好。 我终于想到了如何去做我想做的事情,而我并不以此为傲。

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

为了做到这一点,我不得不实施TextWatcher和onTextChange,除了EditText为空且用户按下DEL键的情况以外,其效果很好。 由于EditText没有改变,所以没有办法检测到DEL键被按下。

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

这是我的代码:

  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
你总是回归真实

注意:在你的编辑文本中提供inputtype。

 <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 ,我只logging退格并进入。 这可能是与TextView类似的问题。 也许子类关键侦听器对于给定的View子类更多的事件是敏感的。

我们在iPhone上也有TextWatcher问题 – 如果缓冲区为空,键盘不会发送del事件。 我们通过预加载1000个字符的键盘缓冲区来解决这个问题。 幸运的是,我们的应用程序隐藏了键盘后面的编辑区域,所以没有看到1000个字符。 这是丑陋的,但它的工作原理(除非用户在input任何数据之前在一排中删除1000个)!