android format edittext在每4个字符之后显示空格

Android – 我想从用户的数字输入到EditText – 它需要用空格分隔 – 每4个字符。 例如:123456781234 – > 1234 5678 1234

这只是为了视觉的目的。 不过,我需要没有空间的字符串作进一步的使用。

什么是我可以做到这一点的最简单的方法?

你需要使用TextWatcher来实现可视化的目的空间。

并使用任何简单的拆分字符串的空间逻辑加入它回或循环通过每个字符的整个字符串明智的并从字符串中消除(char) 32

这是信用卡的editext?
首先创建计数变量

 int count = 0; 

然后把这个在你的oncreate(activity)/ onviewcreated(fragment)

  ccEditText.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) { } @Override public void afterTextChanged(Editable s) { if (count <= ccEditText.getText().toString().length() &&(ccEditText.getText().toString().length()==4 ||ccEditText.getText().toString().length()==9 ||ccEditText.getText().toString().length()==14)){ ccEditText.setText(ccEditText.getText().toString()+" "); int pos = ccEditText.getText().length(); ccEditText.setSelection(pos); }else if (count >= ccEditText.getText().toString().length() &&(ccEditText.getText().toString().length()==4 ||ccEditText.getText().toString().length()==9 ||ccEditText.getText().toString().length()==14)){ ccEditText.setText(ccEditText.getText().toString().substring(0,ccEditText.getText().toString().length()-1)); int pos = ccEditText.getText().length(); ccEditText.setSelection(pos); } count = ccEditText.getText().toString().length(); } }); 

正如@waqas指出的那样,如果您的目标是在用户键入数字时发生这种情况,则需要使用TextWatcher。 以下是您可以实现这些空间的一种可能方式:

 StringBuilder s; s = new StringBuilder(yourTxtView.getText().toString()); for(int i = 4; i < s.length(); i += 5){ s.insert(i, " "); } yourTxtView.setText(s.toString()); 

每当你需要获取没有空格的字符串时,请执行以下操作:

 String str = yourTxtView.getText().toString().replace(" ", ""); 

这里有一点帮助功能。 对于你的例子,你可以调用它

addPadding(" ", "123456781234", 4);

 /** * @brief Insert arbitrary string at regular interval into another string * * @param t String to insert every 'num' characters * @param s String to format * @param num Group size * @return */ private String addPadding(String t, String s, int num) { StringBuilder retVal; if (null == s || 0 >= num) { throw new IllegalArgumentException("Don't be silly"); } if (s.length() <= num) { //String to small, do nothing return s; } retVal = new StringBuilder(s); for(int i = retVal.length(); i > 0; i -= num){ retVal.insert(i, t); } return retVal.toString(); } 

打字时更改生活文字有些困难。 我们应该处理以下问题。

一个。 光标位置b。 我们应该允许用户删除输入的文本。

以下代码处理这两个问题。

  1. 将TextWatcher添加到EditText,并从“afterTextchanged()”中获取文本并编写您的逻辑

    String str =“”; int strOldlen = 0;

      @Override public void afterTextChanged(Editable s) { str = edtAadharNumber.getText().toString(); int strLen = str.length(); if(strOldlen<strLen) { if (strLen > 0) { if (strLen == 4 || strLen == 9) { str=str+" "; edtAadharNumber.setText(str); edtAadharNumber.setSelection(edtAadharNumber.getText().length()); }else{ if(strLen==5){ if(!str.contains(" ")){ String tempStr=str.substring(0,strLen-1); tempStr +=" "+str.substring(strLen-1,strLen); edtAadharNumber.setText(tempStr); edtAadharNumber.setSelection(edtAadharNumber.getText().length()); } } if(strLen==10){ if(str.lastIndexOf(" ")!=9){ String tempStr=str.substring(0,strLen-1); tempStr +=" "+str.substring(strLen-1,strLen); edtAadharNumber.setText(tempStr); edtAadharNumber.setSelection(edtAadharNumber.getText().length()); } } strOldlen = strLen; } }else{ return; } }else{ strOldlen = strLen; Log.i("MainActivity ","keyDel is Pressed ::: strLen : "+strLen+"\n old Str Len : "+strOldlen); } } } 
  2. 在这里,我试图为每四个字符添加空格。 在添加第一个空格之后,文本的长度是5.所以下一个空格是在9个字符之后。

    如果(strLen == 4 || strLen == 9)

    1. 这里还有一个问题是光标位置,一旦你修改了edittext文本,光标就移到第一位。 所以我们需要手动设置光标。

    edtAadharNumber.setSelection(edtAadharNumber.getText()长度());

    1. 我的文字长度只有12个字符。 所以我正在做手动计算,如果你的文本是动态的,那么你写动态逻辑。

文本格式是000 000 0000

android edittext textwatcher格式的电话号码如xxx-xxx-xx-xx

 public class PhoneNumberTextWatcher implements TextWatcher { private static final String TAG = PhoneNumberTextWatcher.class .getSimpleName(); private EditText edTxt; private boolean isDelete; public PhoneNumberTextWatcher(EditText edTxtPhone) { this.edTxt = edTxtPhone; edTxt.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { isDelete = true; } return false; } }); } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { if (isDelete) { isDelete = false; return; } String val = s.toString(); String a = ""; String b = ""; String c = ""; if (val != null && val.length() > 0) { val = val.replace(" ", ""); if (val.length() >= 3) { a = val.substring(0, 3); } else if (val.length() < 3) { a = val.substring(0, val.length()); } if (val.length() >= 6) { b = val.substring(3, 6); c = val.substring(6, val.length()); } else if (val.length() > 3 && val.length() < 6) { b = val.substring(3, val.length()); } StringBuffer stringBuffer = new StringBuffer(); if (a != null && a.length() > 0) { stringBuffer.append(a); if (a.length() == 3) { stringBuffer.append(" "); } } if (b != null && b.length() > 0) { stringBuffer.append(b); if (b.length() == 3) { stringBuffer.append(" "); } } if (c != null && c.length() > 0) { stringBuffer.append(c); } edTxt.removeTextChangedListener(this); edTxt.setText(stringBuffer.toString()); edTxt.setSelection(edTxt.getText().toString().length()); edTxt.addTextChangedListener(this); } else { edTxt.removeTextChangedListener(this); edTxt.setText(""); edTxt.addTextChangedListener(this); } } } 

@ Ario的回答干净的版本遵循DRY原则:

 private int prevCount = 0; private boolean isAtSpaceDelimiter(int currCount) { return currCount == 4 || currCount == 9 || currCount == 14; } private boolean shouldIncrementOrDecrement(int currCount, boolean shouldIncrement) { if (shouldIncrement) { return prevCount <= currCount && isAtSpaceDelimiter(currCount); } else { return prevCount > currCount && isAtSpaceDelimiter(currCount); } } private void appendOrStrip(String field, boolean shouldAppend) { StringBuilder sb = new StringBuilder(field); if (shouldAppend) { sb.append(" "); } else { sb.setLength(sb.length() - 1); } cardNumber.setText(sb.toString()); cardNumber.setSelection(sb.length()); } ccEditText.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) { } @Override public void afterTextChanged(Editable s) { String field = editable.toString(); int currCount = field.length(); if (shouldIncrementOrDecrement(currCount, true)){ appendOrStrip(field, true); } else if (shouldIncrementOrDecrement(currCount, false)) { appendOrStrip(field, false); } prevCount = cardNumber.getText().toString().length(); } }); 

假设你知道字符串的最后长度,你可以这样实现一个TextWatcher

 override fun setUp(view: View?) { editText.addTextChangedListener(object : TextWatcher{ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { } override fun onTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) { if(p2 == 0 && (p0.length == 4 || p0.length == 9 || p0.length == 14)) editText.append(" ") } override fun afterTextChanged(p0: Editable?) { } }) 

您只需为每个4位块添加一个空格。 p2 == 0是为了保证用户不删除,否则他/她会得到库存。

代码在Kotlin中,你可以用Java完全一样的方式来完成。