2012-04-20 2 views
8

Android - Voglio ottenere un numero di input dall'utente in un EditText - deve essere separato da spazi - ogni 4 caratteri. Esempio: 123456781234 -> 1234 5678 1234formato android per visualizzare spazi dopo ogni 4 caratteri

Questo è solo per scopi visivi. Tuttavia ho bisogno della stringa senza spazi per un ulteriore utilizzo.

Qual è il modo più semplice per farlo?

risposta

3

È necessario utilizzare TextWatcher per ottenere spazi per scopi visivi.

E utilizzare qualsiasi stringa semplicemente diviso dallo spazio logica a farne parte posteriore o ciclo attraverso l'intera stringa per carattere saggia ed eliminare (char) 32 dalla stringa

2

come @waqas ha sottolineato, è necessario utilizzare un TextWatcher se il tuo obiettivo è quello di fare in modo che ciò accada mentre l'utente digita il numero. Ecco un modo potenziale si potrebbe ottenere gli spazi:

StringBuilder s; 
s = new StringBuilder(yourTxtView.getText().toString()); 

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

Ogni volta che è necessario per ottenere la stringa senza spazi fare questo:

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

qui è un po funzione di aiuto. Per il vostro esempio, si potrebbe chiamare con

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

è questo EditExt per la carta di credito?
creare prima variabile di conteggio

int count = 0; 

poi mettere questo nel tuo OnCreate (attività)/onviewcreated (frammento)

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

questo codice dovrebbe essere effettivamente utilizzare un tipo di ciclo, non lunghezze hardcode come questo – Lukas1

0

cambiamento del testo dal vivo durante la digitazione è qualche cosa difficile. dovremmo gestire i seguenti problemi.

a. posizione del cursore b. dovremmo consentire all'utente di eliminare il testo inserito.

Il seguente codice gestisce entrambi i problemi.

  1. Aggiungi TextWatcher al EditText, e ottenere il testo da "afterTextchanged()" e scrivere la vostra logica

    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. Qui sto cercando di aggiungere spazio per ogni quattro caratteri. Dopo aver aggiunto il primo spazio, la lunghezza del testo è 5. quindi lo spazio successivo è dopo 9 caratteri del genere.

    se (STRLEN == 4 || STRLEN == 9)

    1. Ecco un altro problema è la posizione del cursore, una volta che si modifica il testo del EditText, la mossa cursore primo posto. quindi abbiamo bisogno di impostare il cursore manualmente.

    edtAadharNumber.setSelection (edtAadharNumber.getText(). Length());

    1. La lunghezza del mio testo è di soli 12 caratteri. Quindi sto facendo calcoli manuali, se il tuo testo è dinamico allora scrivi la logica dinamica.
+0

Si prega di rimuovere i vostri commenti fuori dal codice. –

+0

Quando provo a eliminare il testo, cancelli solo 4 caratteri alla volta. – Roon13

1

formato del testo è 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

versione più pulita di @ risposta di Ario, che segue il principio 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

Supponendo che si conoscere la lunghezza finale della stringa, si potrebbe im complemento un TextWatcher in questo modo:

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?) { 
     } 
    }) 

È sufficiente aggiungere uno spazio di ogni blocco di 4 cifre. p2 == 0 è di assicurare che l'utente non stia eliminando, altrimenti otterrebbe il magazzino.

Il codice è in Kotlin, è possibile farlo esattamente allo stesso modo in Java.