Android:为什么我的OnKeyListener()没有被调用?

时间:2010-09-12 23:19:22

标签: android

我定义了一个EditText字段,我希望在用户编辑该字段时收到通知。 所以我想:简单 - 我添加一个OnKeyListener,所以我做了。但即使文本字段被编辑(甚至显示输入/修改的文本),我也没有得到任何回调,即LOG输出没有显示。

    TextView text = new TextView(this);
    text.setText(...);
    ...
    text.setOnKeyListener(new OnKeyListener()
    {                           
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            TextView tv = (TextView)v;
            CharSequence val = tv.getText();
            Log.v(TAG, "value: " + val);
            // ... rest omitted for brevity
        }
    });

任何想法,为什么永远不会调用回调?

迈克尔

PS:叹气! Android真的很奇怪!到目前为止,我似乎几乎没有任何东西像人们期望的那样立即工作。并且 - 信不信由你 - 我有很多GUI经验,尤其是。在Java(AWT,Swing,SWT,你的名字......)但Android是一个非常强硬的野兽!

3 个答案:

答案 0 :(得分:18)

您是否使用软键盘(ime)输入编辑文字?我相信onKeyListener只能用来自硬件键盘的事件调用。如果可以,最好使用TextWatcher。 onKeyListener not working with soft keyboard (Android)

答案 1 :(得分:7)

我遇到了完全相同的问题,但仅在我的一个Android应用中,我从来没有弄清楚它们之间的区别。

我的解决方案是做Mayra建议的并添加TextWatcher来处理TextChanged事件。所以无论文本输入如何发生都可以。

editName.addTextChangedListener(new TextWatcher () {
        public void afterTextChanged(Editable s) {
            Button btnSave = (Button)findViewById(R.id.btnSaveToon);
            if(s.length() > 0)
                btnSave.setEnabled(true);
            else
                btnSave.setEnabled(false);
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }

    });

在模拟器和我的HTC Inspire中扮演魅力

答案 2 :(得分:1)

您说您正在处理EditText,但您的代码引用了TextView。我的猜测是你的布局XML文件中有一个EditText,但是你在代码中引用了这个新创建的TextView,实际上甚至根本没有在应用程序的UI中。

如果布局XML文件中已存在EditText,则需要在Java代码中获取指向它的指针,可能使用findViewById()方法。然后将OnKeyListener添加到EditText。

在XML中定义布局实际上更有意义(至少在许多情况下,如果不是大多数情况下),而不是一次定义一个组件,然后将每个组件添加到UI,就像在Swing中一样。但是,毫无疑问,它需要一些人习惯。