空的KeyEvent和onEditorAction()actionid = 0(果冻豆/的Nexus

2019-06-26 00:23发布

我有一个编辑文本其功能是作为我的应用程序的搜索框。 Jelly Bean中对我的Nexus 7,当我输入一些东西到我正在听的文本框,并按下回车键该KeyEvent = NULL和ActionId = 0传入onEditorAction()方法。 有人遇到过这种情况么? 我想这可能是一个错误。

在第二个如果跌破我的语句得到一个空指针,因为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();
     }
}

Answer 1:

最终将在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();
    }
}


Answer 2:

我发现,我的“像小虫的行为”,是由于imeActionLabel复杂的事情。 我只用它,因为它是在提到文本字段指南作为一种具有自定义返回键标签。 下面是我的棒棒糖测试的结果,

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

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

onEditorAction被调用一次。

  • 的KeyEvent = NULL,actionId = 5 = EditorInfo.IME_ACTION_NEXT
    • 如果返回true,光标停留在EditText上,键盘打开
    • 如果返回false,光标移动到下一个可选择的,如果需要打开键盘

案例2: imeOptions ,返回键符号=勾选

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

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"/>

onEditorAction可以称为不止一次。

  • 的KeyEvent = NULL,actionId = 0

    • 如果返回true,光标停留在EditText上,键盘打开 ,onEditorAction不叫第二次
    • 如果返回false,onEditorAction被称为第二次:
  • 的KeyEvent = KeyEvent.ACTION_DOWN ,actionId = 0

    • 如果返回false,光标移动到下一个可选择的,键盘如果需要打开 ,onEditorAction不叫第三次
    • 如果返回true,onEditorAction被称为第三次:
  • 的KeyEvent = KeyEvent.ACTION_UP ,actionId = 0

    • 如果返回true,光标停留在EditText上,键盘打开
    • 如果返回false,光标移动到下一个可选择的,如果需要打开键盘

笔记:

我不知道如果actionId = 0是EditorInfo.IME_ACTION_UNSPECIFIEDEditorInfo.IME_NULL

如果下一个可选择的是不可编辑,返回键符号变成一个左箭头。

您还可以使用setOnFocusChangeListener覆盖onFocusChange ,这将根据上述光标行为被调用。



Answer 3:

除了KeyEvent.ACTION_UP我们还需要捕捉KeyEvent.ACTION_DOWN 。 除非KeyEvent.ACTION_UP将永远不会被传递到EditText所以我们onEditorAction将无法正常工作。 例:

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    final boolean isEnterEvent = event != null
            && event.getKeyCode() == KeyEvent.KEYCODE_ENTER;
    final boolean isEnterUpEvent = isEnterEvent && event.getAction() == KeyEvent.ACTION_UP;
    final boolean isEnterDownEvent = isEnterEvent && event.getAction() == KeyEvent.ACTION_DOWN;

    if (actionId == EditorInfo.IME_ACTION_DONE || isEnterUpEvent ) {
        // Do your action here
        performLogin();
        return true;
    } else if (isEnterDownEvent) {
        // Capture this event to receive ACTION_UP
        return true;
    } else {
        // We do not care on other actions
        return false;
    }
}

你必须更换EditorInfo.IME_ACTION_DONE纠正的版本EditorInfo.IME_ACTION_根据android:imeOptions="actionNext"



Answer 4:

这可能是值得一提的,你可以对输入(取决于Android版本)点击获取多个事件。 对于一个在KeyDown(KeyEvent.ACTION_DOWN),一个用于KEYUP(KeyEvent.ACTION_UP)。 当我忘了检查,我意外地开始了动作重复两所服务器调用。

searchBox.setOnEditorActionListener(new OnEditorActionListener() {
// enter key in search box triggers search
@Override
public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event) {
    if ((event != null && event.getAction() == KeyEvent.ACTION_UP) || event==null) {
        onSearchButtonClicked();
    }
    return true;
}
});


Answer 5:

你不发现真相,如果自定义返回键。 你既需要设置imeActionLabelimeActionId在布局。 如:

imeActionLabel="xxxx"
imeActionId = "6"

在Java代码:

@Override
public boolean onEditorAction(TextView v, int actionId,  KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
     doSomeThing();
     return true;
   }

    return false;
}

它将很好地工作。



文章来源: null keyevent and actionid = 0 in onEditorAction() (Jelly Bean / Nexus 7)