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 - 处理虚拟和物理键盘事件的主要内容,如果未能解决你的问题,请参考以下文章