我定义了一个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是一个非常强硬的野兽!答案 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中一样。但是,毫无疑问,它需要一些人习惯。