尝试长按时,Android中的后退按钮出现奇怪的行为

时间:2016-08-23 21:51:53

标签: android ontouchlistener

我在尝试为“后退”按钮实现长按捕获事件时,在我的Android应用程序中发现了一个奇怪的行为。

我将以下代码用于我想要在所有活动中管理的所有物理键(我删除了不重要的部分):

// Called when the user presses the "physical" buttons
@Override
public boolean dispatchKeyEvent(KeyEvent aEvent)
{
    // Used to know which event was triggered
    int action = aEvent.getAction();
    int keyCode = aEvent.getKeyCode();

    // Get the pressed button
    switch (keyCode)
    {
        // Key "back"
        case KeyEvent.KEYCODE_BACK:
            // If the button is pressed down
            if (action == KeyEvent.ACTION_DOWN)
            {
                // DEBUG
                App.debug("BACK button is pressed!");
            }
            // If the button is released
            else if (action == KeyEvent.ACTION_UP)
            {
                // DEBUG
                App.debug("BACK button is released!");
            }
        return true;

        [...]

        default:
        return super.dispatchKeyEvent(aEvent);
    }
}

“App.debug()”方法只是“Log.d()”的包装器。

当我测试上面的代码时,通过“后退”按钮上的一个简单的“点击”,我可以看到预期的行显示在logcat中(当我触摸后退按钮时,“按下BACK按钮!” BACK按钮被释放!“当我移开手指时。”

现在,当我将手指放在后退按钮上时,我只能看到2次“按下后退按钮!”出现在logcat中,它们之间大约相隔半秒钟。然后当我释放按钮(比如10秒钟)时,我看到“BACK按钮被释放了!”句子按预期出现。这是我在logcat中的内容:

BACK button is pressed! - >一旦我用手指触摸按钮

BACK button is pressed! - >半秒钟后

BACK button is released! - >一旦我移开手指

为什么“后退”按钮长按ONLY会触发两个“按钮按下”事件?

编辑:我认为我不够清楚,对不起(英语不是我的自然语言)...问题是我只有触发2个事件,只要我的手指仍然存在在按钮上它应该触发许多“按钮按下”事件,直到我移开我的手指。添加“仅”应该在我的描述中。

编辑2:经过一些验证后,它似乎只发生在某些设备上......也许这里涉及Android版本?

“未按预期工作”经过测试的设备是:

  • Sony Xperia Z1 with Android 4.4.2
  • Klipad Smart D71与Android 4.4.2

“按预期工作”测试的设备是:

  • Samsung Galaxy Grand Prime与Android 4.4.4
  • 使用Android 5.1.1的华为Y5

有什么想法吗?

度过愉快的一天。

1 个答案:

答案 0 :(得分:0)

两个button_down事件:1表示正常按下,1表示长按。

在Android 2.0中,Activity包含method

public boolean onKeyLongPress(int keyCode, KeyEvent event)

例如,按下后退按钮上的长按键将是:

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        // do your stuff here
        return true;
    }
    return super.onKeyLongPress(keyCode, event);
}

正常点击后退按钮事件。您可以使用:

@Override
public void onBackPressed()
{
     // code here to show dialog
     super.onBackPressed();  // optional depending on your needs
}