Android KeyEvent 未注册

Android KeyEvent Not registering

我正在尝试监听 android 中的某些关键事件,我将事件监听器附加到编辑文本。我正在寻找 space-bar press、pound 和 @ key.for 一些原因,这个事件只针对 space bar 和数字键触发。该功能甚至不会为任何其他键执行....我想知道为什么?他们是我做错了什么吗?

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

我在这里 http://developer.android.com/reference/android/text/method/KeyListener.html 找到关于 onClickListener 的:

Key presses on soft input methods are not required to trigger the methods in this listener, and are in fact discouraged to do so.The default android keyboard will not trigger these for any key to any application targetting Jelly Bean or later, and will only deliver it for some key presses to applications targetting Ice Cream Sandwich or earlier.

另外:

Note that for most cases this interface has been superceded by general soft input methods as defined by InputMethod; it should only be used for cases where an application has its own on-screen keypad and also wants to process hard keyboard events to match it.

因此,如果您遇到上述情况,请尝试重新考虑文档中推荐的代码。
作为替代方案,您可以尝试使用这个:

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