【问题标题】:Confused about Android key event handling. Any good explanations?对 Android 关键事件处理感到困惑。有什么好的解释吗?
【发布时间】:2011-04-13 06:08:02
【问题描述】:

我是 Android 的相对初学者。有人对如何在 EditText/TextView 中监听按键和软键有理智的解释吗?

我希望看到一个全面的教程或一组示例。

据我了解,我可以在我的 Activity 中添加一个 KeyListener,例如onKeyDown(), onKeyUp() 但是当我尝试这个时,我无法触发普通键的事件,例如只有 HOME 和 BACK。

我看到有人提到使用 TextWatcher,但这与处理原始键事件不同。

在 SO 上似乎有许多半解决方案。希望您能帮助消除混乱的迷雾...

【问题讨论】:

标签: android android-edittext keyevent


【解决方案1】:

您必须分配一个关键侦听器,而不是活动,而是 EditText 本身。

【讨论】:

  • 这有帮助 - 一层薄雾消失了!
【解决方案2】:

这是我必须听的 BACK 或 MENU 键事件。只需添加此方法,无需实现任何接口。我在我的 BaseActivity 中执行此操作,每个 Activity 都从中继承。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(NAME, "Key pressed");

    switch (keyCode) {
    case KeyEvent.KEYCODE_BACK:
        Log.d(NAME, "Back pressed");
        // IGNORE back key!!
        return true;
        /* Muestra el Menú de Opciones */
    case KeyEvent.KEYCODE_MENU:
        Intent menu = new Intent(this, Menu.class);

        // start activity
        startActivity(menu);
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

PS:我强烈反对忽略后退键。

【讨论】:

  • 是的 - MENU 和 BACK 工作正常,但 KEYCODE_0、KEYCODE_1... 和 KEYCODE_ENTER 不会触发。我看到 onEditorAction 的代码对 ENTER 做出反应,但我必须单独捕获它吗?对不起,如果我让你感到困惑。我认为您的代码是一个好的开始...您必须考虑重复、取消、长按等(取决于操作系统版本)。仍在寻找指向全面讨论的指针。
  • IME 操作通常不是原始键事件;它们是对从当前焦点视图检索的 InputConnection 的编辑操作。 (TextView/EditText 有一个用于编辑其文本的实现)。您可以改为通过将焦点放在不提供 InputConnection 的视图上来获取原始事件...但是这将大大限制键盘的功能。
【解决方案3】:

例如:

myEditText.setOnKeyListener(new OnKeyListener() {
     public boolean onKey(View v, int keyCode, KeyEvent event) {
         if (event.getAction() == KeyEvent.ACTION_DOWN)
             if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
                //your code here
             }
         return false;
     }
});

【讨论】:

    【解决方案4】:

    我最近发现了另一种使用 Activity onKeyDown 卡住的方法,或者使用 view.setOnKeyListener 设置视图中的关键侦听器(在我的情况下,这并不能真正处理来自 ADB 的关键事件)。

    自从引入了android P 方法addOnUnhandledKeyEventListener。当您的视图能够捕获未处理的关键事件时,它允许您做任何您需要做的事情。

    这是我如何使用它的示例:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) yourView.addOnUnhandledKeyEventListener { v, event ->
        when (event.keyCode) {
            KeyEvent.KEYCODE_UNKNOWN -> {
                TODO("Do whatever you need to do.")
                true // Specify you did handle the event
            }
            KeyEvent.KEYCODE_SOFT_RIGHT -> {
                TODO("Do whatever you need to do.")
                true // Specify you did handle the event
            }
            // etc...
            else -> false // Specify you didn't handle the event
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2013-05-15
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多