null keyevent and actionid = 0 in onEditorAction() (Jelly Bean / Nexus 7)

I found that my "bug-like behavior" was due to imeActionLabel complicating things. I only used it because it was mentioned in the Text Fields Guide as a way to have a custom return key label. Here are the results of my tests in Lollipop,

Case 1: default, return key symbol = closing angle bracket

<EditText
    android:singleLine="true"
    android:inputType="textUri"/>

onEditorAction is called once.

  • KeyEvent = null, actionId = 5 = EditorInfo.IME_ACTION_NEXT
    • if return true, cursor remains in EditText, keyboard open
    • if return false, cursor moves to next focusable, keyboard open if necessary

Case 2: imeOptions, return key symbol = checkmark

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"/>

onEditorAction is called once.

  • KeyEvent = null, actionId = 6 = EditorInfo.IME_ACTION_DONE
    • if return true, cursor remains in EditText, keyboard open
    • if return false, cursor remains in EditText, keyboard closes

Case 3: imeActionLabel, return key symbol = "URdone"

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"
    android:imeActionLabel="URdone"/>

onEditorAction can be called more than once.

  • KeyEvent = null, actionId = 0

    • if return true, cursor remains in EditText, keyboard open, onEditorAction is NOT called a second time
    • if return false, onEditorAction is called a SECOND time:
  • KeyEvent = KeyEvent.ACTION_DOWN, actionId = 0

    • if return false, cursor moves to next focusable, keyboard open if necessary, onEditorAction is NOT called a third time
    • if return true, onEditorAction is called a THIRD time:
  • KeyEvent = KeyEvent.ACTION_UP, actionId = 0

    • if return true, cursor remains in EditText, keyboard open
    • if return false, cursor moves to next focusable, keyboard open if necessary

NOTES:

I'm not sure if actionId = 0 is from EditorInfo.IME_ACTION_UNSPECIFIED or EditorInfo.IME_NULL.

If the next focusable is non-editable, the return key symbol becomes a left pointing arrow.

You can also use setOnFocusChangeListener to override onFocusChange, which will be called according to the above cursor behavior.


Ended up adding in a null check for KeyEvent. Thanks to commonsware for pointing out this happens on 3.0+. Seems more like a workaround then a solution, but it works.

// Search field logic.
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    Log.d(TAG, "onEditorAction");
    if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) {
        return false;
    } else if (actionId == EditorInfo.IME_ACTION_SEARCH
        || event == null
        || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
              .....Do some stuff();
    }
}