【问题标题】:Detect which soft key was pressed Android?检测哪个软键被按下了Android?
【发布时间】:2017-07-03 16:08:44
【问题描述】:

我试图检测按下了哪个键,到目前为止,我能够使用dispatchKeyEvent() 方法检测到 SHIFT、BACKSPACE 和 ENTER,但它似乎无法检测到字母和数字。而且我还尝试了onKeyDownonKeyUp,他们甚至没有检测到SHIFT、BACKSPACE 和ENTER,更不用说字母表和字母了。 我的目标是在我的EditText 中输入一个字母并检测 KeyStroke 并使用Toast 显示它

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
   int keyaction = event.getAction();
   if(keyaction == KeyEvent.ACTION_DOWN )
    {
        String keycode = event.getCharacters();
        Toast toast = Toast.makeText(this,String.valueOf(event.getKeyCode()), Toast.LENGTH_LONG);
        toast.show();
    }
    return super.dispatchKeyEvent(event);
}

这是检测 SHIFT、BACKSPACE 和 ENTER 的键码,但不是字母

【问题讨论】:

标签: android keylistener keylogger onkeylistener


【解决方案1】:

使用这样的东西:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_D:
            //do something
            return true;
        case KeyEvent.KEYCODE_F:
            //do something
            return true;
        case KeyEvent.KEYCODE_d:
            //do something
            return true;
        case KeyEvent.KEYCODE_f:
            //do something
            return true;
        default:
            return super.onKeyUp(keyCode, event);
    }
}

【讨论】:

  • 我在onKeyDown()onKeyUp() 都试过了,但还是没有,所以我在dispatchKeyEvent() 中使用了switch 语句,即使这样也检测不到
【解决方案2】:

你所问的确切答案是这样的:-

    @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
         // Do Code here
    }
else if(keyCode == KeyEvent.KEYCODE_0) 
   {

   }
//And so on
return super.onKeyDown(keyCode, event); }

您可以在this page 的常量部分了解它。

但是,从您问题的最后一行来看,我猜您是以错误的方式接近您的要求。你真的不需要上面的代码。相反,只需将一个 Text Changed Listener 添加到您的 EditText 并在文本更改时创建一个 Toast。类似于以下内容:-

 editText.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) {
           String text = s.toString();
           Toast.makeText(context,s.charAt(s.length()-1).toString(), Toast.LENGTH_LONG).show();
        }
    });

【讨论】:

    【解决方案3】:

    如果您想实现在每次按字符时显示 toast,以便您可以使用 Edittext.addonTexchange 侦听器,在此 onTextChange 方法中,您可以显示您按下的文本,您只需获取最后输入的字符并显示 toast。

    textView.addTextChangedListener(new TextWatcher(){
    
        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // here right logic for get last char and show it on toast
    
        }
    
    });
    

    对于像 done 和 Backpress 这样的操作键,使用 setOnKeyListener 并使用不同的操作。 t

    extView.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
                if((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    enterPressed();
                    return true;
                }
                return false;
            }
    });
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2013-11-16
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 2020-10-28
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多