【问题标题】:Adding a Dash in the editText automatically in Android在Android中自动在editText中添加破折号
【发布时间】:2013-06-03 07:01:30
【问题描述】:

看看我的代码:

txt_HomeNo.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            boolean flag = true;
            String eachBlock[] = txt_HomeNo.getText().toString().split("-");
            for (int i = 0; i < eachBlock.length; i++) {
                if (eachBlock[i].length() > 3) {
                    flag = false;
                }
            }

            if (flag) {

                txt_HomeNo.setOnKeyListener(new OnKeyListener() {

                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {

                        if (keyCode == KeyEvent.KEYCODE_DEL)
                            keyDel = 1;
                        return false;
                    }
                });

                if (keyDel == 0) {

                    if (((txt_HomeNo.getText().length() + 1) % 4) == 0) {

                        if (txt_HomeNo.getText().toString().split("-").length <= 3) {
                            txt_HomeNo.setText(txt_HomeNo.getText() + "-");
                            txt_HomeNo.setSelection(txt_HomeNo.getText().length());
                        }
                    }
                    a = txt_HomeNo.getText().toString();
                } else {
                    a = txt_HomeNo.getText().toString();
                    keyDel = 0;
                }

            } else {
                txt_HomeNo.setText(a);
            }

        }

电话号码的最大长度只有 7。当我已经输入 3 位数字时,它会附加破折号(这就是我想要发生的)但我的问题是接下来的 3 位数字也附加破折号 (像这样:511-871-...我的问题是如何用下一个 4 位数字进行编码,并在上面加上破折号。请帮我解决一下这个。谢谢!

【问题讨论】:

标签: android textwatcher


【解决方案1】:

我认为,我有一个简单的解决方案,请查看随附的屏幕截图

在 2 位和 5 位后附加 / 以获得 DOB。

追加和删除都没有循环问题。

editeTextDob.addTextChangedListener(new TextWatcher() {
            int prevL = 0;

            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                prevL = dob.getText().toString().length();
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                int length = editable.length();
                 if ((prevL < length) && (length == 2 || length == 5)) {
                    editable.append("/");
                }
            }
        });

【讨论】:

  • 这个有一个错误。尝试使用退格键将文本一直删除到“14/02”并输入一些内容。我期待添加一个“/”。但事实并非如此。
  • @karlingen 我会调查这个并更新我的答案。感谢反馈
【解决方案2】:

试试这个

@Override
public void afterTextChanged(Editable text) {     


    if (text.length() == 3 || text.length() == 7) {
        text.append('-');
    }


}

或所有这些

private boolean isFormatting;
private boolean deletingHyphen;
private int hyphenStart;
private boolean deletingBackward;

@Override
public void afterTextChanged(Editable text) {
    if (isFormatting)
        return;

    isFormatting = true;

    // If deleting hyphen, also delete character before or after it
    if (deletingHyphen && hyphenStart > 0) {
        if (deletingBackward) {
            if (hyphenStart - 1 < text.length()) {
                text.delete(hyphenStart - 1, hyphenStart);
            }
        } else if (hyphenStart < text.length()) {
            text.delete(hyphenStart, hyphenStart + 1);
        }
    }
    if (text.length() == 3 || text.length() == 7) {
        text.append('-');
    }

    isFormatting = false;
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    if (isFormatting)
        return;

    // Make sure user is deleting one char, without a selection
    final int selStart = Selection.getSelectionStart(s);
    final int selEnd = Selection.getSelectionEnd(s);
    if (s.length() > 1 // Can delete another character
            && count == 1 // Deleting only one character
            && after == 0 // Deleting
            && s.charAt(start) == '-' // a hyphen
            && selStart == selEnd) { // no selection
        deletingHyphen = true;
        hyphenStart = start;
        // Check if the user is deleting forward or backward
        if (selStart == start + 1) {
            deletingBackward = true;
        } else {
            deletingBackward = false;
        }
    } else {
        deletingHyphen = false;
    }
}

【讨论】:

  • 我遇到了“Selection.getSelectionStart(s);”的问题
  • 大家好!非常感谢您的所有帮助!我只是在@neo108 的帮助下弄清楚了。 :)
  • 第一个代码有错误。使用该代码尝试退格。
【解决方案3】:

使用此代码 这段代码对我有用 它会帮助你

        editText.addTextChangedListener(new TextWatcher() {
        int prevL = 0;
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            prevL = editText.getText().toString().length();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            int length = s.length();
            if ((prevL < length) && (length == 2 || length == 5)) {
                String data = editText.getText().toString();
                editText.setText(data + "/");
                editText.setSelection(length + 1);


            }

        }
    });

【讨论】:

    【解决方案4】:

    改进@techroid 的回答:(kotlin 版本)

    如果字符是字母,这将解决问题,start 始终为 0,但 countafter 是正确的,而如果字符是数字,start 是正确的,而 count 是始终为 1,after 始终为 0。

    测试错误:

    • setDashMasking(yourInput, intArrayOf(3))
    • 类型:asd(这将在 d 之后附加破折号,因此它将变为 asd-

    那就试试删除吧,不能删除,除非你输入123,否则@techroid的回答是不行的。

    以下代码将解决此问题。

        private fun setDashMasking(input: AppCompatEditText, dashIndexes: IntArray) {
            input.addTextChangedListener(object : TextWatcher {
    
                private var isFormatting = false
                private var deletingHyphen = false
                private var hyphenStart = 0
                private var deletingBackward = false
    
                override fun afterTextChanged(editable: Editable) {
                    if (isFormatting) return
    
                    isFormatting = true
    
                    // If deleting hyphen, also delete character before or after it
                    if (deletingHyphen && hyphenStart > 0) {
                        if (deletingBackward) {
                            if (hyphenStart - 1 < editable.length) {
                                editable.delete(hyphenStart - 1, hyphenStart)
                            }
                        } else if (hyphenStart < editable.length) {
                            editable.delete(hyphenStart, hyphenStart + 1)
                        }
                    }
    
                    if (!deletingHyphen &&
                        dashIndexes.contains(editable.toString().length)
                    ) {
                        editable.append('-')
                    }
    
                    isFormatting = false
                }
    
                override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
                    if (isFormatting) return
    
                    // Make sure user is deleting one char, without a selection
                    val selStart = Selection.getSelectionStart(s)
                    val selEnd = Selection.getSelectionEnd(s)
    
                    if (s.length > 1 // Can delete another character
                        && count - after == 1 // deleting only 1 character
                        && s[selStart - 1] == '-' // a hyphen
                        && selStart == selEnd
                    ) { // no selection
                        deletingHyphen = true
                        hyphenStart = selStart - 1
                        // Check if the user is deleting forward or backward
                        deletingBackward = selStart == (selStart - 1) + 1
                    } else {
                        deletingHyphen = false
                    }
                }
    
                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                    listener?.onChanged(s.toString())
                }
            })
        }
    

    【讨论】:

      【解决方案5】:

      为时已晚,但可以帮助其他人

        edtMoneyIntMin.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count, int after) {
      
              }
      
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
                  try {
                      int edtInteger = Integer.valueOf(edtMoneyIntMin.getText().toString());
                      new DecimalFormat("1,000,000,000");
                      String myString = NumberFormat.getInstance().format(edtInteger).replace(",", "/");
                      HOUSE_COST_MIN = myString;
                      txtMoneyIntMin.setText(myString);
                  } catch (NumberFormatException e) {
                      e.printStackTrace();
                  } catch (NullPointerException e) {
                      e.printStackTrace();
                  }
              }
      
              @Override
              public void afterTextChanged(Editable s) {
      
              }
          });
      

      【讨论】:

        【解决方案6】:

        对于这种请求,我通常依赖于 editText Masking 技术。

        这是一个运行良好的库:

        https://github.com/egslava/edittext-mask

        但我最喜欢处理删除字符的方法是:

        compile 'com.redmadrobot:inputmask:2.3.0'
        

        它在自述文件中有一个电话号码示例。

        【讨论】:

          【解决方案7】:

          根据从 beforeTextChange 方法获取的先前文本的子字符串检查 onTextChanged 方法中的连字符。

          【讨论】:

            猜你喜欢
            • 2013-06-03
            • 2015-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-19
            • 2022-01-18
            • 2018-05-16
            • 1970-01-01
            相关资源
            最近更新 更多