Android -EditText TextWatcher要保持小写,无法保持插入(输入光标)位置



我有一个表单,用户可以在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();
            }
        }
    });

相关内容

  • 没有找到相关文章

最新更新