I have an edit text which functions as a search box in my application. In Jelly Bean on my Nexus 7 when I type something into the text box which I am listening on and hit enter the KeyEvent = null and ActionId = 0 passed into the onEditorAction() method. Has anyone else encountered this? I'm thinking it might be a bug.
In the second if statement below I get a null pointer because the actionId = 0 and KeyEvent = null;
// 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; if (actionId == EditorInfo.IME_ACTION_SEARCH || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { .....Do some stuff(); } }
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(); } }
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.
EditorInfo.IME_ACTION_NEXT
Case 2: imeOptions
, return key symbol = checkmark
<EditText android:singleLine="true" android:inputType="textUri" android:imeOptions="actionDone"/>
onEditorAction is called once.
EditorInfo.IME_ACTION_DONE
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
KeyEvent = KeyEvent.ACTION_DOWN
, actionId = 0
KeyEvent = KeyEvent.ACTION_UP
, actionId = 0
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With