2012-04-20 23 views
8

Android - 我想从用户获取一个数字输入到EditText中 - 它需要用空格分隔 - 每4个字符。 示例:123456781234 - > 1234 5678 1234android format edittext在每4个字符后显示空格

这仅用于视觉目的。但是,我需要没有空间的字符串作进一步的使用。

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

回答

3

您需要使用TextWatcher来实现视觉目的空间。

并通过空间使用任何简单分割字符串逻辑明智加入其背部或遍历每个字符整个字符串,并从字符串消除(char) 32

2

为@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(" ", ""); 
0

这里是一个小的帮助作用。为了您的例子中,你将与

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(); 
} 
4

称呼它是这个editext信用卡?
首先创建计数变量

int count = 0; 

那么把它放进你的OnCreate(活动)/ onviewcreated(片段)

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(); 
     } 
    }); 
+0

此代码应该确实使用某种循环,而不是像这样的硬编码长度 – Lukas1 2018-02-20 09:10:44

0

变化的文字直播,同时打字一些什么困难。我们应该处理以下问题。

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

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

  1. 添加TextWatcher到EditText上,并从文本 “afterTextchanged()”,写你的逻辑

    字符串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)

  3. 这里的另一问题是光标位置,一旦修改的EditText的文本,将光标移动到第一名。所以我们需要手动设置光标。

edtAadharNumber.setSelection(edtAadharNumber.getText()。length());

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

请将您的评论从代码中移除。 – 2016-06-09 05:29:12

+0

当我尝试删除文本时,它一次只能删除4个字符。 – Roon13 2017-01-30 11:46:56

1

格式的文本是000 000 0000

android edittext textwatcher format phone number like 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); 
    } 

} 
} 
0

@ 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(); 
    } 
}); 
0

假设你知道String的最后长度,你可以im plement一个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中以完全相同的方式执行该代码。

相关问题