如题在布局文件中分别定义一个TextView和EditText;
TextView tv_text = (TextView)view.findViewById(R.id.choose_text);
EditTextet_text = (EditText)view.findViewById(R.id.edit_text);
分别设置按键监听器,目的是为了实现当输入的数字达到numLength长度后重新显示输入
tv_text.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
TextView vt = (TextView)v;
if(event.getAction()==KeyEvent.ACTION_DOWN)
{
System.out.println("1111");
if ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9))
{
if (vt.getText().length() < numLength)
{
vt.setText(vt.getText().toString() + (keyCode - 7) + "");
}
else
{
if (keyCode - 7 > 0)
{
vt.setText((keyCode - 7) + "");
}
}
return true;
}
}
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT ||
keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
return true;
}
// TODO Auto-generated method stub
return false;
}
});
et_text.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
EditText vt = (EditText)v;
if(event.getAction()==KeyEvent.ACTION_DOWN)
{
System.out.println("2222");
if ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9))
{
if (vt.getText().length() < numLength)
{
vt.setText(vt.getText().toString() + (keyCode - 7) + "");
}
else {
if (keyCode - 7 > 0)
vt.setText((keyCode - 7) + "");
}
return true;
}
}
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT ||
keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
return true;
}
return false;
}
});
原以为上面的代码没什么问题,但是实际运行效果却显示tv.text能够满足需求,但是et.text并没有进入ACTION_DOWN,奇怪的是虽然没有进入上述代码,但是依然能够显示输入(但是没有长度的限制);如果改为监听ACTION_UP出现的问题是虽然能够进入上述代码但是按一次键分别在显示框中的前面和后面添加新输入的数字,比较奇怪。
问题分析(个人猜测):
由于EditText控件本身的特性,系统能够接受按键信息并显示,但是是在ACTION_UP的时候输入一次,后来人为的又输入(setOnKeyListener方法)进去一次,所以会出现两次显示;