Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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();      } } 
like image 545
LowDev1 Avatar asked Jul 02 '12 20:07

LowDev1


2 Answers

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();     } } 
like image 132
LowDev1 Avatar answered Sep 18 '22 19:09

LowDev1


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.

like image 27
BeatriceThalo Avatar answered Sep 20 '22 19:09

BeatriceThalo