2017-10-17 67 views
0

我想模拟一系列重要事件。经过一段时间的搜索,我发现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()函数未被调用?

回答

0

¿你可以尝试使用这种方法吗? 的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; 
} 
0

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) { 

     } 
    }); 
+0

感谢您指出“OnKeyListener仅适用于硬件键盘”。这解释了为什么我的OnKey函数未被调用。但我希望活动(或视图或某种服务)处理**虚拟键事件**,这些虚拟键事件不是由真实键盘或软键盘生成的。 – dudu

+0

即使文本观察者会解决你的问题,我猜。 – Anonymous

0

试试这个,而不是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); 
      } 
+0

我试过了,但是失败了。有一件事我很好奇,textview和activity之间有什么关系?由于使用函数'sendKeyEvent',keyevent只能发送到视图。那么为什么活动的“dispatchKeyEvent”直接处理事件?我想这与android事件调度策略有关,但我不完全理解。 – dudu

+0

您可以从此链接获取一些信息: https://stackoverflow.com/questions/7846050/difference-between-onkey-onkeydown-and-dispatchkeyevent-methods-provided –