未激活活动中的onKey
我想模拟一系列重要事件。经过一段时间的搜索,我发现BaseInputConnection
类型的对象的方法sendkeyEvent
。所以在MainActivity
类的onCreate()
函数中,我发送了一个keyevent三次到一个textview,我绑定到这个activity。未激活活动中的onKey
@Override
protected void onCreate(Bundle savedInstanceState){
...
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI);
tv.setOnKeyListener(this);
BaseInputConnection mInputConnection = new BaseInputConnection(tv, true);
//BaseInputConnection mInputConnection = new BaseInputConnection(tv, false);
KeyEvent kleft = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT);
for(int i=0;i<3;i++){
mInputConnection.sendKeyEvent(kleft);
Log.d(TAG, "keyevent sent");
}
}
MainActivity
类实现了接口OnKeyListener
。
@Override
public boolean OnKey(View v, int keyCode, KeyEvent){
Log.d(TAG, "OnKey starts.");
if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){
Log.d(TAG, "key left.");
return true;
}
return false;
}
检查logcat的输出后,我发现“keyevent sent”是三次打印,这意味着keyevents被发送。但是没有“OnKey开始”。为什么OnKey()函数未被调用?
¿你可以尝试使用这种方法吗? 的onkeydown作品对我来说
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
/* Sample for handling the Menu button globally */
return true;
}
return false;
}
OnKeyListener只与硬件键盘”的作品。检查此链接
https://developer.android.com/reference/android/view/View.OnKeyListener.html
而是使用TextWatchListener为TextView的文本改变。
tv.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
试试这个,而不是onKey()
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){
Log.d(TAG, "key left.");
return true;
}
return super.dispatchKeyEvent(event);
}
我试过了,但是失败了。有一件事我很好奇,textview和activity之间有什么关系?由于使用函数'sendKeyEvent',keyevent只能发送到视图。那么为什么活动的“dispatchKeyEvent”直接处理事件?我想这与android事件调度策略有关,但我不完全理解。 – dudu
您可以从此链接获取一些信息: https://*.com/questions/7846050/difference-between-onkey-onkeydown-and-dispatchkeyevent-methods-provided –
感谢您指出“OnKeyListener仅适用于硬件键盘”。这解释了为什么我的OnKey函数未被调用。但我希望活动(或视图或某种服务)处理**虚拟键事件**,这些虚拟键事件不是由真实键盘或软键盘生成的。 – dudu
即使文本观察者会解决你的问题,我猜。 – Anonymous