【问题标题】:Change EditText inputType programmatically without clearing values以编程方式更改 EditText inputType 而不清除值
【发布时间】:2019-04-03 13:33:02
【问题描述】:

我有一个程序要从 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() });
            }

【问题讨论】:

  • 你的 AlphaInputFilter 和 NumberInputfilter 导致了这个问题,你能说明你是如何实现它们的吗??
  • 更改 InputType 加上 LengthFilter 就足够了,最后你想要的值是字母数字,它不适合你的任何 InputFilters
  • 天哪,你是对的。我真愚蠢....好吧,我将删除 Alpha 和 Numeric 过滤器,并用我自己的字符处理替换它们。谢谢:)

标签: c# xamarin android-8.1-oreo


【解决方案1】:

您不需要使用第二个 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) });
}

【讨论】:

  • 我的原始代码在 7.1.1 上完美运行仍然很奇怪。而且,在 8.1 中,现在 AlphaInputFilter 似乎是唯一有问题的,当然,这意味着当我启用 NumberInputFilter 时,它并没有类似地清除我的 Alpha 字符。
  • 在任何 InputFilters 上是否 keepOriginal = false?
  • 可能两者都有相同的问题,但您永远不会到达那里,因为第一个过滤器更改了 SelectionStart 值
  • 啊哈,是的。这取决于允许使用哪些字符。我正在显示一个数字输入键盘,但在数字键盘上检查 IsDigit,而不仅仅是数字,所以只有 Alpha 键盘变成 KeepOriginal = false。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多