我有一个编辑文本其功能是作为我的应用程序的搜索框。 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();
}
}
最终将在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();
}
}
我发现,我的“像小虫的行为”,是由于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_UNSPECIFIED
或EditorInfo.IME_NULL
。
如果下一个可选择的是不可编辑,返回键符号变成一个左箭头。
您还可以使用setOnFocusChangeListener
覆盖onFocusChange
,这将根据上述光标行为被调用。
除了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"
这可能是值得一提的,你可以对输入(取决于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;
}
});
你不发现真相,如果自定义返回键。 你既需要设置imeActionLabel和imeActionId在布局。 如:
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;
}
它将很好地工作。