在我正在测试的一部手机上(HTC Incredible,Android 2.2,软件3.21.605.1),我遇到以下行为.
当按下Sense UI键盘上的Enter键时,将立即调用onEditorAction事件处理程序两次(立即).
KeyEvent.getEventTime()对于调用事件的两次都是相同的,这导致我解决这个问题:
protected void onCreate(Bundle savedInstanceState) {
[...]
EditText text = (EditText)findViewById(R.id.txtBox);
text.setOnEditorActionListener(new OnEditorActionListener() {
private long lastCalled = -1;
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ( event.getEventTime() == lastCalled ) {
return false;
} else {
lastCalled = event.getEventTime();
handleNextButton(v);
return true;
}
}
});
[...]
}
Run Code Online (Sandbox Code Playgroud)
EditText定义为:
<EditText
android:layout_width="150sp"
android:layout_height="wrap_content"
android:id="@+id/txtBox"
android:imeOptions="actionNext"
android:capitalize="characters"
android:singleLine="true"
android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions"
android:autoText="false"
android:editable="true"
android:maxLength="6"
/>
Run Code Online (Sandbox Code Playgroud)
在我测试过的所有其他设备上,操作按钮被正确标记为"下一步",并且该事件仅在按下该按钮时被调用一次.
这是Sense UI键盘中的错误,还是我做错了什么?
谢谢你的帮助.
更新 - 由于给出的答案,我已经确定以下作为我的检查.这在我可用于测试的两部手机上都能正常工作(Sense UI和Cyanogenmod CM7)
if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) {
return false;
}
if ( actionId != EditorInfo.IME_ACTION_NEXT && actionId != EditorInfo.IME_NULL ) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
Gub*_*bel 28
正如米奇所说,你必须检查事件动作:
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event == null || event.getAction() != KeyEvent.ACTION_DOWN)
return false;
// do your stuff
return true;
}
Run Code Online (Sandbox Code Playgroud)
此代码段适用于Sense UI和模拟器.
| 归档时间: |
|
| 查看次数: |
8770 次 |
| 最近记录: |