【问题标题】:onKey in activity not invoked未调用活动中的 onKey
【发布时间】:2017-10-17 08:22:02
【问题描述】:

我想模拟一系列关键事件。经过一段时间的搜索,我找到了BaseInputConnection 类型的对象的sendkeyEvent 方法。所以在MainActivity 类的onCreate() 函数中,我向一个textview 发送了3 次keyevent,我将它绑定到这个activity。

@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”是printend 3次,意思是keyevents被发送了。但是没有“OnKey 启动”。为什么没有调用 OnKey() 函数?

【问题讨论】:

    标签: android android-activity android-view key-events


    【解决方案1】:

    ¿ 你可以试试这个方法吗? 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;
    } 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您指出“OnKeyListener 仅适用于硬件键盘”。这就解释了为什么我的 OnKey 函数没有被调用。但我希望活动(或视图或某些服务)处理不是从真实键盘或软键盘生成的虚拟键事件
      • 我猜即使是文本观察器也能解决你的问题。
      【解决方案3】:

      试试这个而不是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事件调度策略有关,但我不完全理解。
      • 你可以从这个链接获取一些信息:stackoverflow.com/questions/7846050/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2022-06-14
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多