2

我需要用户根据这个特定的模式在 EditText 中输入文本:

123.456-7890-123.456

用户可以输入任意数量的整数,所以他们也可以输入 123.456-7

我不希望用户输入。或 - 只是数字,如输入掩码。

数字键盘也应该只显示。

我已经广泛搜索了 StackOverflow,并看到了使用 InputFilter、ChangedListener、TextWatcher 的示例,但没有找到与我正在尝试做的事情相似的任何事情。我已经尝试过我发现的各种实现,但我在使用这些方面缺乏经验,所以我可能忽略了一些东西。

欢迎大家提出意见。

4

4 回答 4

0

在多次尝试实现 InputFilter 或正则表达式失败后,我选择了更直接的方法:

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    String a = "";
    String str = id.getText().toString(); 
    String replaced = str.replaceAll(Pattern.quote("."),""); 
    replaced = replaced.replaceAll(Pattern.quote("-"),"");
                char[] id_char = replaced.toCharArray();
                int id_len = replaced.length();
    for(int i = 0; i < id_len; i++) {
                    if(i == 2 || i == 12) {
                        a += id_char[i] + ".";                      
                    }
                    else if (i == 5 || i == 9) {
                        a += id_char[i] + "-";
                    }
                    else a += id_char[i];
                }
    id.removeTextChangedListener(this);
    id.setText(a);
    if(before > 0) id.setSelection(start);
    else id.setSelection(a.length());
    id.addTextChangedListener(this);                

}

我不知道这是否是最好的方法,但它确实有效。我还没有解决的一个问题是如何在用户删除或插入数字后处理光标位置。如果用户将光标插入 EditText 中的某处并输入新数字,则光标会跳到 EditText 的末尾。我希望光标停留在它所在的位置。另一个问题是,如果用户在 EditText 数字中插入光标并退格以删除数字,则第一个键输入不起作用,而在第二个键上输入了数字。我只能猜测这与焦点有关吗?

于 2013-04-14T12:06:56.210 回答
0

您将不得不使用 TextWatcher 和正则表达式模式匹配器来完成您想要做的事情。

这个答案应该会有所帮助:Android AutoCompleteTextView with Regular Expression?

于 2013-04-13T01:49:00.560 回答
0

您可以创建自己的实现InputFilter. 然后您将按如下方式应用它:

MyInputFilter filter = new MyInputFilter(...);
editText.setFilters(new InputFilter[]{filter});

有关 InputFilter 的工作原理,请参阅文档,然后参阅 Android 中使用的一些 InputFilter 的源代码,了解如何实现它们的一些想法。

于 2013-04-13T01:53:43.280 回答
-3

使用这个:https ://github.com/alobov/SimpleMaskWatcher 。

只需为这个观察者设置你的面具(###.###-####-###.###)。它会自动添加特殊符号,并且不会检查您的输入字符串是否完整。android:inputType="number"但是显示数字键盘,您必须自己处理EditText.

于 2016-04-25T09:45:23.760 回答