【问题标题】:Format Android EditText to specific pattern将 Android EditText 格式化为特定模式
【发布时间】:2016-04-25 19:20:29
【问题描述】:

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

123.456-7890-123.456

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

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

数字键盘也应该只显示。

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

欢迎提出任何建议。

【问题讨论】:

  • 是电话号码的输入吗?

标签: android android-edittext


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在多次尝试实现 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 数字内并退格以删除数字,则第一个键输入不起作用,而在第二个键上输入了数字。我只能猜测这与专注有关?

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多