2010-09-12 26 views
20

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

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

任何想法,为什么回调从未被称为?

Michael

PS .:感叹! Android真的很古怪!看起来我迄今为止所触及的几乎没有任何东西可以按照人们的期望工作。并且 - 信不信由你 - 我对图形用户界面有着丰富的经验,在Java中(AWT,Swing,SWT,你把它命名为......)但Android是一个非常强悍的野兽!

+1

@Falmarri魅力,有什么不好呢?从概念上讲,getText返回一个字符序列,因此将返回值存储在该类型的变量中没有任何问题。你必须这样做才能使用getText方法。你不能只改变onKey方法来接受一个TextView,因为它覆盖了OnKeyListener中的一个方法。 (可以说,应该有一个@Override,但是在这种情况下它很明显。) – MatrixFrog 2010-09-13 08:58:56

+1

@Falmari:你显然没有为Android编程。我也会使用字符串,但是Android alas会将CharSequence的所有位置而不是字符串返回,所以您必须频繁地执行强制转换或toString()。如果一个方法头只定义了一个“View”,但你知道它是一个TextView,并且你需要一个只有TextView提供的方法,那你还能做什么?有更好的建议? – mmo 2010-09-13 15:30:12

回答

18

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

+0

我读过引用的附录,这确实是问题。当然,我从来没有尝试过使用真正的键盘(因为我的设备没有任何...),仿真器的键盘显然也没有触发这样的事件。我改变为一个TextWatcher建议,这就是诀窍!谢谢! – mmo 2010-09-14 12:17:36

1

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

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

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

+0

你是对的 - TextView实际上是一个EditText,不是由“new”创建的,而是使用inflater。为了简洁,我在这里改变了这一点。但我仍然没有得到任何onKey() - 回调... – mmo 2010-09-13 20:35:21

+0

我可能是错的,但我不认为你想在这里使用inflater。只要执行'setContentView',它就会为你充气。我的猜测是,相同的XML会膨胀两次 - 一次通过'setContentView'并一次通过'LayoutInflater'。因此,您有两份相同布局的副本,并且将侦听器添加到错误的副本中。 – MatrixFrog 2010-09-14 02:23:11

+0

不,问题不在于有两个副本。我甚至在开始添加自己的孩子之前,明确地删除所有的孩子。这个问题似乎是下面的影响 - 参见Mayra的追加。 – mmo 2010-09-14 12:16:00

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启发

相关问题