2012-04-20 10 views
8

एंड्रॉइड - मैं उपयोगकर्ता से एक संपादन इनपुट में एक इनपुट इनपुट प्राप्त करना चाहता हूं - इसे रिक्त स्थान से अलग करने की आवश्यकता है - प्रत्येक 4 वर्ण। उदाहरण: 123456781234 -> 1234 5678 1234एंड्रॉइड प्रारूप edittext प्रत्येक 4 अक्षरों के बाद रिक्त स्थान प्रदर्शित करने के लिए

यह केवल दृश्य उद्देश्य के लिए है। हालांकि मुझे आगे के उपयोग के लिए रिक्त स्थान के बिना स्ट्रिंग की आवश्यकता है।

मैं यह कैसे कर सकता हूं सबसे आसान तरीका है?

उत्तर

3

आपको दृश्य उद्देश्य रिक्त स्थान प्राप्त करने के लिए TextWatcher का उपयोग करने की आवश्यकता है।

और इसे वापस या पाश चरित्र प्रति पूरी स्ट्रिंग के माध्यम से बुद्धिमान में शामिल होने और स्ट्रिंग से (char) 32 को खत्म करने तर्क अंतरिक्ष से किसी भी बस विभाजन स्ट्रिंग का उपयोग

2

रूप @waqas ने कहा, आप का उपयोग करना होगा एक टेक्स्टवॉचर यदि आपका लक्ष्य ऐसा करना है क्योंकि उपयोगकर्ता संख्या टाइप करता है।

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

0

परिवर्तन को लाइव पाठ डाल दिया। हमें निम्नलिखित मुद्दों को संभालना चाहिए।

ए। कर्सर स्थिति बी। हमें उपयोगकर्ता को दर्ज टेक्स्ट को हटाने की अनुमति देनी चाहिए।

निम्नलिखित कोड दोनों मुद्दों को संभालते हैं।

  1. EditText को TextWatcher जोड़ें, और से पाठ मिलता है "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)

    1. यहाँ एक और समस्या यह है कर्सर की स्थिति, आप edittext का पाठ, कर्सर ले जाने के संशोधित एक बार पहले स्थान पर। इसलिए हमें कर्सर को मैन्युअल रूप से सेट करने की आवश्यकता है।

    edtAadharNumber.setSelection (edtAadharNumber.getText() लंबाई());

    1. मेरी टेक्स्ट लंबाई केवल 12 वर्ण है। तो मैं मैन्युअल गणना कर रहा हूं, यदि आपका टेक्स्ट गतिशील है तो आप गतिशील तर्क लिखते हैं। पाठ की
+0

कृपया कोड से बाहर अपनी टिप्पणियां हटा दें। –

+0

जब मैं टेक्स्ट हटाने की कोशिश करता हूं तो यह एक समय में केवल 4 वर्ण हटा देता है। – Roon13

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 के जवाब की

क्लीनर संस्करण:

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

यह मानते हुए कि आप स्ट्रिंग की अंतिम लंबाई पता है, आप im कर सकते हैं एक TextWatcher इस तरह plement:

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 यह सुनिश्चित करना है कि उपयोगकर्ता हटा नहीं रहा है, अन्यथा उसे स्टॉक मिल जाएगा।

कोड कोटलिन में है, आप जावा में बिल्कुल वही कर सकते हैं।

संबंधित मुद्दे