我不明白为什么这段代码无效。仅检测到退格键和返回键。监听器不会触发任何其他密钥。我的设备是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;
}
});
答案 0 :(得分:19)
确定。我终于想到了如何做我想做的事情,而且我并不为Android感到骄傲。
我正在编写服务器/客户端应用程序,在客户端我必须打开SoftKeyboard并发送按键(字符和DEL键)...每次按下该键,该字符将被发送到服务器。如果按下DEL,我将序列{BS}发送到服务器。
为了做到这一点,我必须实现TextWatcher和onTextChange,除了EditText为空并且用户按DEL键的情况之外,它的效果很好。由于EditText没有变化,因此无法检测到是否按下了DEL键。
除了TextWatcher之外,我还必须实现我附加到EditText控件的onKeyListener。此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");;
}
};
答案 1 :(得分:4)
你在这里犯了一个错误
它应return true
,如果你处理了这个事件。如果您想允许下一个接收方处理该事件,return false
你总是回归真实
答案 2 :(得分:3)
注意:在您的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;
}
});
答案 3 :(得分:2)
您是否尝试过为该视图使用特定的侦听器子类?
我有一个与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
子类的更多事件敏感。
答案 4 :(得分:0)
我们在iPhone上也遇到了TextWatcher问题 - 如果缓冲区为空,键盘不会发送del事件。我们通过预加载1000个字符的键盘缓冲区来解决它。幸运的是,我们的应用程序隐藏了键盘后面的编辑字段,因此看不到1000个字符。这很难看,但它有效(除非用户在输入任何数据之前连续点击1000次删除!)
答案 5 :(得分:0)
引用自:
http://developer.android.com/reference/android/view/View.OnKeyListener.html
View.OnKeyListener
类概述在将硬件键事件调度到此视图时要调用的回调的接口定义。回调将在将键事件提供给视图之前被调用。这仅对硬件键盘有用。软件输入法没有义务触发此侦听器。
似乎OnKeyListener仅用于硬件钥匙!