我有一个表单,用户可以在EditText字段中输入一些数据。这些EditText小部件之一是用于电子邮件地址。我正在使用文本观看者来确保文本始终为小写,如下所示:
txtEmail.addTextChangedListener(new TextWatcher()
{
String prevString = "";
boolean delAction = false;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.length() < prevString.length())
delAction = true;
else
delAction = false;
}
@Override
public void afterTextChanged(Editable s)
{
if (!delAction)
{
String temp = s.toString().toLowerCase();
if (!temp.equals(prevString))
{
prevString = temp;
txtEmail.setText(temp); // Recursive
txtEmail.setSelection(temp.length());
}
}
else
{
prevString = s.toString();
}
}
});
在onTextChanged(...)
中,我还进行了比较,以确保删除正常。
现在解决问题。txtEmail.setText(temp);
导致整个观察者递归运行。我可以通过添加txtEmail.setSelection(temp.length());
并使用if
逃脱递归环,但我无法找到递归的尾声末端,但我找不到将脑袋保持在特定点的方法。例如,如果我写了" Myema(Il Missing(@sosings.com,并想返回以在每个字母的字母上进行更正。
现在是怪异的部分。我尝试在beforeTextChanged(...)
之前或onTextChanged(...)
之前保持Caret的位置。当我键入某些内容时,在每种情况下,CARET位置都会正确更改。但是,当时,我们输入了递归呼叫的载体的位置,报告为0。我猜想,当我实际键入时,也会注册caret运动时,但是因为在递归呼叫中,没有镜头运动,而不是"粘贴"在EditText中,我没有位置更改。
因此,问题:如何保持杰作的位置?我的想法是实际上串起文本。将所有内容都带到CARET使更改将其用txtEmail.setSelection(temp.length());
将其扔到那里,然后在其他步骤中附加其余的字符串(尚未尝试(。我还有其他(简单/高效的(方法可以使用内置工具来处理它?
预先感谢!
也许您已经很难接近这一点。为什么不使用
android:digits="qwertyuiopasdfghjklzxcvbnm_,.@.,"
用于电子邮件的EditText?如果允许用户输入任何其他字符,只需将它们添加到 android:digits 字段。
。编辑OP:
遵循Alexandru的建议(请参阅评论(以再次注册和注册文本观看者,代码更改并工作如下:
: txtEmail.addTextChangedListener(new TextWatcher()
{
String prevString = "";
boolean delAction = false;
int caretPos = 0;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
caretPos = txtEmail.getSelectionStart();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.length() < prevString.length())
delAction = true;
else
delAction = false;
}
@Override
public void afterTextChanged(Editable s)
{
if (!delAction)
{
prevString = s.toString().toLowerCase();
txtEmail.removeTextChangedListener(this);
txtEmail.setText(prevString);
txtEmail.addTextChangedListener(this);
txtEmail.setSelection(caretPos + 1);
}
else
{
txtEmail.setSelection(caretPos - 1);
prevString = s.toString();
}
}
});