Android - 处理虚拟和物理键盘事件

Posted

技术标签:

【中文标题】Android - 处理虚拟和物理键盘事件【英文标题】:Android - handle virtual & physical keyboard events 【发布时间】: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?

谢谢!

【问题讨论】:

【参考方案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 的可编辑性 - 它会导致循环。小心!

【讨论】:

以上是关于Android - 处理虚拟和物理键盘事件的主要内容,如果未能解决你的问题,请参考以下文章

处理 EditText 未聚焦状态时的物理键盘按键事件

没有焦点的Phonegap iOS键盘事件

移动web 怎么捕获虚拟键盘弹出和关闭事件

适用于 Android 的 VS 模拟器停止响应键盘

Android 键盘事件触发以及监听

Android 点击其他地方键盘消失