onEditorAction()中的null keyevent和actionid = 0(Jelly Bean/Nexus 7)

Low*_*ev1 24 android android-edittext android-4.2-jelly-bean

我有一个编辑文本,在我的应用程序中用作搜索框.在我的Nexus 7上的Jelly Bean中,当我在正在监听的文本框中输入内容并点击时,输入KeyEvent = null并将ActionId = 0传递给onEditorAction()方法.有人遇到过这种情况么?我认为这可能是一个错误.

在下面的第二个if语句中,我得到一个空指针,因为actionId = 0和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();
     }
}
Run Code Online (Sandbox Code Playgroud)

Low*_*ev1 41

结束为KeyEvent添加空检查.感谢commonsware指出这种情况发生在3.0+.似乎更像是一种解决方法,然后是一种解决方案,但它确实有效.

// 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • for**[onEditorAction(TextView v,int actionId,KeyEvent event)](http://developer.android.com/intl/es/reference/android/widget/TextView.OnEditorActionListener.html#onEditorAction(android.widget.TextView ,%20int,%20android.view.KeyEvent))**,`actionId`可能是**[EditorInfo.IME_NULL](http://developer.android.com/intl/es/reference/android/view/inputmethod/ EditorInfo.html#IME_NULL)**,表示*按下回车键*. (7认同)

Bea*_*alo 7

我发现我的"类似bug的行为"是因为imeActionLabel复杂的事情.我只使用它,因为它在" 文本字段指南"中被提及作为一种自定义返回键标签的方法.以下是我在Lollipop测试的结果,

情况1:默认,返回键符号=结束角括号

<EditText
    android:singleLine="true"
    android:inputType="textUri"/>
Run Code Online (Sandbox Code Playgroud)

onEditorAction被调用一次.

  • KeyEvent = null,actionId = 5 = EditorInfo.IME_ACTION_NEXT
    • 如果返回true,则光标保持在EditText中,键盘打开
    • 如果返回false,则光标移动到下一个可聚焦,必要时键盘打开

情况2 imeOptions:,返回键符号=复选标记

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"/>
Run Code Online (Sandbox Code Playgroud)

onEditorAction被调用一次.

  • KeyEvent = null,actionId = 6 = EditorInfo.IME_ACTION_DONE
    • 如果返回true,则光标保持在EditText中,键盘打开
    • 如果返回false,则光标保留在EditText中,键盘关闭

案例3 imeActionLabel:,返回键符号="URdone"

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"
    android:imeActionLabel="URdone"/>
Run Code Online (Sandbox Code Playgroud)

onEditorAction可以被多次调用.

  • KeyEvent = null,actionId = 0

    • 如果返回true,则光标保持在EditText中,键盘打开,onEditorAction不再被调用
    • 如果返回false,则onEditorAction称为SECOND时间:
  • KeyEvent = KeyEvent.ACTION_DOWN,actionId = 0

    • 如果返回false,则光标移动到下一个可聚焦,必要时键盘打开,第三次不调用onEditorAction
    • 如果返回true,则onEditorAction称为第三个时间:
  • KeyEvent = KeyEvent.ACTION_UP,actionId = 0

    • 如果返回true,则光标保持在EditText中,键盘打开
    • 如果返回false,则光标移动到下一个可聚焦,必要时键盘打开

笔记:

我不确定actionId = 0是来自EditorInfo.IME_ACTION_UNSPECIFIED还是EditorInfo.IME_NULL.

如果下一个可聚焦是不可编辑的,则返回键符号将变为左箭头.

您还可以使用setOnFocusChangeListener覆盖onFocusChange,这将根据上面的光标行为进行调用.