以编程方式更改 EditText 输入类型而不清除值

Change EditText inputType programmatically without clearing values

我有一个程序要从 Android 7.1.1 升级到现在的 8.1。大多数事情都非常顺利,但我在一件事上遇到了障碍。

我有一个使用 EditText 的邮政编码条目。此条目最初以 ClassText 的 InputType 开始,当用户输入他们的字符时,我在 ClassText 和 ClassNumber 之间来回交换以获得结果格式,例如:"M1N2J8"

在 7.1.1 上运行,没有问题。但是,行为似乎在 8.1 中发生了变化。当我输入 "M" 然后输入“1”时,我没有问题,但是在我将其更改回 ClassText 以输入 "N" 后,它会清除“1”并留下 "MN"

我将不胜感激任何人可能提供的关于我如何解决这个问题的任何见解。最坏的情况,我将简单地启用字母数字键盘并自己处理限制字符,但我的客户非常喜欢让键盘在文本和数字输入之间切换,所以这就是我现在的目标。

谢谢!

if (txt.SelectionStart == 0 || txt.SelectionStart == 2 || txt.SelectionStart == 4)
            {
                txt.InputType = InputTypes.ClassText | InputTypes.TextFlagCapCharacters;
                txt.SetFilters(new IInputFilter[] { new InputFilterLengthFilter(maxLength), new AlphaInputFilter() });
            }
            else if (txt.SelectionStart == 1 || txt.SelectionStart == 3 || txt.SelectionStart == 5)
            {
                txt.InputType = InputTypes.ClassNumber;
                txt.SetFilters(new IInputFilter[] { new InputFilterLengthFilter(maxLength), new NumberInputFilter() });
            }

您不需要使用第二个 InputFilter,您的最终输出是字母数字,不适合其中任何一个

if (txt.SelectionStart == 0 || txt.SelectionStart == 2 || txt.SelectionStart == 4)
{
    txt.InputType = InputTypes.ClassText | InputTypes.TextFlagCapCharacters;
    txt.SetFilters(new IInputFilter[] { new InputFilterLengthFilter(maxLength) });
}
else if (txt.SelectionStart == 1 || txt.SelectionStart == 3 || txt.SelectionStart == 5)
{
    txt.InputType = InputTypes.ClassNumber;
    txt.SetFilters(new IInputFilter[] { new InputFilterLengthFilter(maxLength) });
}