【问题标题】:Android - handle virtual & physical keyboard eventsAndroid - 处理虚拟和物理键盘事件
【发布时间】:2011-07-20 23:26:53
【问题描述】:

在阅读了几个类似问题的答案*后,我确实意识到 onKeyListener() 不会从软(虚拟)键盘获取按键事件。它只能从硬(物理)键盘获取它们。解决方法是使用 TextWatcher 或 onKeyboardActionListener。我有以下问题:

(1) 有没有一种方法可以通过只实现一个监听器来监听来自任何键盘(软键盘或硬键盘)的按键?或者基本上是一个适用于两者的单一 API?

(2) TextWatcher 或 onKeyboardActionListener 与 onKeyListener() 的 onKey() 方法不同,不传递当前具有焦点的视图(并且用户正在其中输入输入)。那么,如果我要使用 TextWatcher 或 onKeyboardActionListener,如何获得当前的焦点视图?我需要它才能根据输入在用户键入输入的 EditText 上设置一些属性。

*相关问题: onKeyListener not working on virtual keyboard, onKeyListener not working with soft keyboard (Android), Android: why is my OnKeyListener() not called?

谢谢!

【问题讨论】:

    标签: android event-handling keyboard listener


    【解决方案1】:

    我也遇到了同样的问题。并且假设没有很好的方法来实现一种处理软键盘事件的解决方案。我为delete 事件实现了onKeyListener(),为按键事件实现了TextWatcher。

    m_edtRecipients.addTextChangedListener(new TextWatcher() {
            boolean bConsumed = false;
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!bConsumed) {
                    RecipientsTextStyle.format(m_edtRecipients.getText(), m_dbProcessor);
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if (count != 0) {
                    bConsumed = true;
                    Log.d(TAG, "delete true");
                } else {
                    bConsumed = false;
                    Log.d(TAG, "erase false");
                }
            }
    
            @Override
            public void afterTextChanged(Editable s) {
    
            }
        });
    

    TextWatcher 方法有一个很大的缺点 - 您无法更改已链接的 EditText 的可编辑性 - 它会导致循环。小心!

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2015-12-26
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多