在Android editText中同时使用keyListener和textChangedListener
我试着两者兼用在Android editText中同时使用keyListener和textChangedListener,android,android-edittext,Android,Android Edittext,我试着两者兼用 editPhoneNumber.setKeyListener(new KeyListener() 及 但它们似乎相互阻塞,我的编辑文本不再可编辑 谢谢你的帮助 编辑: 我正在尝试将输入格式化为用户类型: 输入:555111233 格式化输入:555 111 22 33 格式化部分工作得很好,但我尝试添加KeyListener的原因是当用户试图通过按delete键进行删除时,以及当输入长度变为(比方说)12个字符时,TextChangedListener总是在文本末尾加上一个字
editPhoneNumber.setKeyListener(new KeyListener()
及
但它们似乎相互阻塞,我的编辑文本不再可编辑
谢谢你的帮助
编辑:
我正在尝试将输入格式化为用户类型:
输入:555111233
格式化输入:555 111 22 33
格式化部分工作得很好,但我尝试添加KeyListener的原因是当用户试图通过按delete键进行删除时,以及当输入长度变为(比方说)12个字符时,TextChangedListener总是在文本末尾加上一个字符来中断用户的删除。这就是为什么我试图在输入为delete键时禁用TextChangedListener
boolean isResetClicked;
EditText editPhoneNumber;
Button buttonReset;
protected void onCreate(Bundle savedInstanceState)
{
editPhoneNumber = (EditText) findViewById(R.id.editPhoneNumber);
buttonReset = (Button) findViewById(R.id.buttonResetPhoneNumber);
buttonReset.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
isResetClicked = true;
editPhoneNumber.getText().clear();
isResetClicked = false;
}
});
editPhoneNumber.setKeyListener(new KeyListener()
{
@Override
public boolean onKeyUp(View view, Editable text, int keyCode,
KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_DEL)
{
isResetClicked = true;
}
else
isResetClicked=false;
return false;
}
@Override
public boolean onKeyOther(View view, Editable text, KeyEvent event)
{
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onKeyDown(View view, Editable text, int keyCode,
KeyEvent event)
{
return false;
}
@Override
public int getInputType()
{
// TODO Auto-generated method stub
return 0;
}
@Override
public void clearMetaKeyState(View view, Editable content,
int states)
{
// TODO Auto-generated method stub
}
});
editPhoneNumber.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count)
{
String str;
if (!isResetClicked)
{
if (s.length() == 0)
{
editPhoneNumber.setText("(");
}
if (s.length() == 1)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText("(" + str);
editPhoneNumber.setSelection(editPhoneNumber.getText()
.length());
}
if (s.length() == 4)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + ") ");
editPhoneNumber.setSelection(editPhoneNumber.getText()
.length());
}
if (s.length() == 9)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + " ");
editPhoneNumber.setSelection(editPhoneNumber.getText()
.length());
}
if (s.length() == 12)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + " ");
editPhoneNumber.setSelection(editPhoneNumber.getText()
.length());
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s)
{
}
});
编辑2:
即使我仍然无法理解为什么两个事件侦听器会阻止我的edittext,我还是通过修改代码解决了问题:
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count)
{
String str;
/*Log.i("ED",
"LengthBefore before (lengthBefore = lengthAfter;): "
+ String.valueOf(lengthBefore));*/
lengthBefore = lengthAfter;
lengthAfter = s.length();
/*Log.i("ED",
"LengthBefore after (lengthBefore = lengthAfter;): "
+ String.valueOf(lengthBefore));*/
if ((lengthBefore < lengthAfter) || lengthBefore == 0)
{
if (!isResetClicked)
{
if (s.length() == 0)
{
editPhoneNumber.setText("(");
}
if (s.length() == 1)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText("(" + str);
editPhoneNumber.setSelection(editPhoneNumber
.getText().length());
}
if (s.length() == 4)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + ") ");
editPhoneNumber.setSelection(editPhoneNumber
.getText().length());
}
if (s.length() == 9)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + " ");
editPhoneNumber.setSelection(editPhoneNumber
.getText().length());
}
if (s.length() == 12)
{
str = editPhoneNumber.getText().toString();
editPhoneNumber.setText(str + " ");
editPhoneNumber.setSelection(editPhoneNumber
.getText().length());
}
}
}
lengthAfter = s.length();
/*Log.i("ED", "LengthAfter after (lengthAfter = s.length();): "
+ String.valueOf(lengthAfter));
Log.i("ED", "LengthBefore: " + String.valueOf(lengthBefore));
Log.i("ED", "LengthAfter: " + String.valueOf(lengthAfter));*/
}
当用户试图删除字符时,新的长度将比旧的长度短。因此,我通过以下方式阻止代码检查长度:
if ((lengthBefore < lengthAfter) || lengthBefore == 0)
你有更多的示例代码吗?你的密钥侦听器和文本更改侦听器在做什么,使你认为它们在互相阻止?用另一种方法解决它,请检查编辑2。
if ((lengthBefore < lengthAfter) || lengthBefore == 0)