OnEditorActionListener在SenseUI键盘上使用相同的eventTime调用两次

mba*_*ord 29 android

在我正在测试的一部手机上(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和模拟器.

  • 这似乎几乎是答案,虽然在我的另一部手机上(运行CyanogenMod CM7),当我按下键盘上的"下一步"时,"event"为空,所以我也必须检查它. (2认同)