我需要听一下终端仿真的按键。所以我没有EditText
。但我通过
public class Click implements View.OnClickListener
{
@Override
public void onClick (View view)
{
CursorText terminal = (CursorText) findViewById (R.id.term_window);
InputMethodManager manager;
manager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
manager.showSoftInput (terminal, InputMethodManager.SHOW_FORCED);
}
}
此处的变量terminal
是从CursorText
派生的自定义类TextView
的实例。它具有属性android:textIsSelectable="true"
,因此可以接受点击次数。否则它有android:imeOptions="flagNoExtractUi|flagForceAscii"
,但这些似乎没有任何不利影响。
我的问题是现在正在接受击键。调查API文档看起来好像没有可靠的方法,因为在任何相关的文档中都声明它所描述的类和方法仅适用于硬件键盘!但必须有办法。
我尝试过多种方法,onKeyListener
,onKeyPreIme
等,大多数都没有做出反应。例如,onKeyPreIme
需要在从View
派生的类中被覆盖,在我的例子中,明显的选择是类terminal
是一个实例。它不是EditText
,也许是onKeyPreIme
永远不会被调用的原因。我认为出于同样的原因,我不能在我的案例中使用TextWatcher
。
到目前为止,最好的结果是覆盖了活动中的onKeyDown
。几乎每个键都会调用此方法,包括Backspace;一个例外是一个最重要的键,即Enter(Return)键。我有一种感觉,在我的处理之前调用了一些其他的侦听器方法,但是没有传递Enter键事件。我不知道怎么找出来。
我对onKeyDown
的另一个问题是它在按住键时不会生成自动重复。由于它似乎只报告KeyEvent.ACTION_DOWN
,但没有报告KeyEvent.ACTION_UP
,因此我无法自行创建自动重复。
我想我可以在没有自动重复的情况下生活,但没有Enter键是一个显示阻止。那么如何解锁Enter键事件?当我按Enter键时,什么阻止调用onKeyDown
?或者,我应该采用完全不同的方式来听击键?
顺便说一句。我正在对Lollipop和Kitkat进行测试,包括真实硬件上的CM和仿真器上的老式Google-Android,试图支持Jelly Bean及其后续版本。
答案 0 :(得分:0)
SOftkeyboards很少创建关键事件。它们通常通过调用inputConnection.commitText来工作,该文件一次占用整个字符串。要做你想做的事,你需要将InputMethod绑定到一个视图并覆盖视图的onCreateInputConnection,以返回一个可以正确处理commitText的自定义InputConnection。