2016-05-15 66 views
1

我想在android中侦听某些关键事件,我将事件侦听器附加到编辑文本。我正在寻找空格键,英镑和@键。由于某些原因,这个事件只能触发空格键和数字键。该函数甚至不会被执行任何其他键......我想知道为什么?是他们的事情,我做错了吗?Android的KeyEvent未注册

package com.stv.mynotes; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 

import java.util.StringTokenizer; 

public class TestActivity extends AppCompatActivity implements View.OnKeyListener 
{ 

    EditText edit_txt; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     edit_txt = (EditText) (findViewById(R.id.test_txt)); 
     edit_txt.setOnKeyListener(this); 
    } 
    public boolean onKey(View v,int keyCode,KeyEvent event) 
    { 
     int tmpCode = event.getKeyCode(); 
     if (event.getAction() == KeyEvent.ACTION_DOWN) 
     { 
      if (tmpCode == KeyEvent.KEYCODE_SPACE) 
      { 
       Log.i("Test", "Space pressed:"+tmpCode); 
       return true; 
      } 
      if (tmpCode == KeyEvent.KEYCODE_9) 
      { 
       Log.i("Test", "9 pressed:"+tmpCode); 
       return true; 
      } 
      else 
      { 
       Log.i("Test","Unknown Down:"+tmpCode); 
       return false; 
      } 
     } 
     if(event.getAction()==KeyEvent.ACTION_UP) 
     { 
      if (tmpCode == KeyEvent.KEYCODE_POUND) 
      { 
       Log.i("Test", "Pound pressed:"+tmpCode); 
       return true; 
      } 
      if (tmpCode == KeyEvent.KEYCODE_AT) 
      { 
       Log.i("Test", "@ pressed:"+tmpCode); 
       return true; 
      } 
      else 
      { 
       Log.i("Test","Unknown UP:"+tmpCode); 
       return false; 
      } 
     } 
     else 
      return false; 
    } 
} 

回答

0

,我发现这个在这里http://developer.android.com/reference/android/text/method/KeyListener.html约onClickListener:

软输入法主要印刷机不需要触发这个监听器的方法,并在事实上鼓励做so.The默认的Android键盘不会触发任何针对任何针对Jelly Bean或更高版本的应用程序的密钥,并且只会将其传递给针对冰淇淋三明治或更早版本的应用程序。

另外:

注意,对于大多数情况下,这个接口已经被如由INPUTMETHOD定义的常规软输入方法所取代;它只能用于应用程序有自己的屏幕键盘并且还想处理硬键盘事件以匹配它的情况。

因此,如果您处于上述情况,请按照文档建议重新考虑您的代码。
作为替代方案,你可以尝试使用此:

edit_txt.addTextChangedListener(new TextWatcher() { 
     int initialLength = 0; 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      initialLength = edit_txt.getText().length(); 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      int newLength = edit_txt.getText().length(); 
      if(newLength<initialLength) return; 
      if(edit_txt.getText().charAt(newLength-1)=='@'){ 
       Log.i("test", "@"); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) {} 
    }); 
+0

这是真的,的KeyEvents只对物理按键,如音量和电源按钮,您的建议是正确的。仅仅使用键输入来监听输入事件已被弃用,现在输入可以来自麦克风...我是用文本观察器来实现它的。 谢谢。 – Wafic