我有一段代码:
passwordEditText.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
launch.performClick();
return true;
}
else
{
return false;
}
}
});
我想要的是当按下回车键时它会执行登录命令(启动是执行登录的按钮)。但是,在执行true块之后,它继续执行else块,返回false并导致(仅在某些设备上)登录第二次。
所以我的问题分为两部分:if else语句如何评估为true和false,以及如何实现它以便它不会这样做。我想到了一些技巧可以实现这一点,但这似乎是一个更好理解然后快速修补的问题。
答案 0 :(得分:9)
你看到的是OnKey被解雇两次,第一次关键,第二次关键,所以你必须用
过滤它 if (event.getAction()!=KeyEvent.ACTION_DOWN) {
return true;
}
switch (keyCode) {
case KeyEvent.KEYCODE_1 :
//do something
break;
case KeyEvent.KEYCODE_2 :
//do something
break;
case KeyEvent.KEYCODE_3 :
//do something
break;
}
return true;
答案 1 :(得分:1)
当条件结果导致返回语句时,调试器可能会产生误导。放入一个无用的'int x variable'并让它在返回true之前指定x = 2(比如说),在返回false之前指定x = 3(比如说)。在调试器中再次单步执行,我敢打赌你看到它只进入其中一个块
答案 2 :(得分:1)
尝试使用此代码...
passwordEditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
launch.performClick();
return true;
}
return false;
}
});
答案 3 :(得分:0)
您描述的内容是不可能的。你发布的代码看起来是正确的,所以我想知道你发布的代码片段中是否有错误。
也就是说,一些编码错误可能导致程序员相信正在执行“if”和“else”块。 E.g。
if(condition) {
// do something
}
else; // note the semicolon here
{
// do something else
// this gets executed regardless of whether the condition is true!
}
但是即便如此,如果你的“if”区块中有“返回”,那么你无法进入第二个区块:)
答案 4 :(得分:0)
按下(或保持或释放)某个键时会触发多个事件。
特别是对于按下和释放,会触发以下内容:
ACTION_DOWN
ACTION_DOWN(如果持有,非零repeatCount,事件可能重复多次)
ACTION_UP(如果事件被取消,可能设置了FLAG_CANCELED)
您的代码不会检查操作属性,因此每次发送涉及回车键的事件时都会运行。
替换
if (keyCode == KeyEvent.KEYCODE_ENTER)
与
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP)
如果您只想在解锁密钥时触发一次。检查ACTION_DOWN需要额外的过滤以避免因重复键而发生多次火灾。您可能还想在ACTION_UP发生时检查FLAG_CANCELED的状态。