2011-09-15 1 views
33

Ciao sto avendo EditText con il "testo = 0.00". quando premo il numero 3 dovrebbe essere come 0.03 & seconda volta quando premo il numero 5 il testo dovrebbe essere 0.35. E 35.0, 35.09 come questo. Il EditText inizialmente ha il valore come 0.00.Come utilizzare l'evento EditText onTextChanged quando preme il numero?

Questi sono tutti fatti con lo stesso EditText.

Come ottengo questo? Ho provato su addTextChangedListener() con TextWatcher().

+0

mi può dare u ur soluzione? ho bisogno della stessa identica cosa – usman

risposta

30

È stato selezionato l'approccio corretto. È necessario estendere la classe con TextWatcher e sovrascrivere afterTextChanged(), beforeTextChanged(), onTextChanged().

È necessario scrivere la logica desiderata nel metodo afterTextChanged() per ottenere le funzionalità necessarie.

+1

quando faccio setText() il afterTextChanged viene chiamato di nuovo, come impedirlo? – usman

74

Si può anche provare questo:

EditText searchTo = (EditText)findViewById(R.id.medittext); 
searchTo.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     doSomething(); 
    } 
}); 
+2

quando faccio setText() viene chiamato di nuovo onTextChanged, come impedirlo? – usman

+4

Non è possibile impedire che onTextChanged venga richiamato sull'evento setText. Dovrai farlo da solo come usare alcuni booleani che sono impostati su true prima di impostare il testo e su ontextchanged, controllare quello booleano e decidere se procedere con l'evento onTextChanged o meno. Un'altra soluzione è rimuovere TextChangeListener prima di impostare il testo e impostarlo nuovamente dopo aver impostato il testo. –

+0

Sì, non puoi impedirlo. Google consiglia di utilizzare il metodo [setSpan] (https://developer.android.com/reference/android/text/Spannable.html) se è necessario sapere dove sono state apportate le modifiche –

5

Ecco, ho scritto qualcosa di simile a ciò che u bisogno:

inputBoxNumberEt.setText(".  "); 
    inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length()); 
    inputBoxNumberEt.addTextChangedListener(new TextWatcher() { 

     boolean ignoreChange = false; 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, 
             int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, 
            int before, int count) { 
      if (!ignoreChange) { 
       String string = s.toString(); 
       string = string.replace(".", ""); 
       string = string.replace(" ", ""); 
       if (string.length() == 0) 
        string = ".  "; 
       else if (string.length() == 1) 
        string = ". " + string; 
       else if (string.length() == 2) 
        string = "." + string; 
       else if (string.length() > 2) 
        string = string.substring(0, string.length() - 2) + "." + string.substring(string.length() - 2, string.length()); 
       ignoreChange = true; 
       inputBoxNumberEt.setText(string); 
       inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length()); 
       ignoreChange = false; 
      } 
     } 
    }); 
+0

Shoule inserire la logica in "afterTextChanged". documentazione su "onTextChanged" - "Si tratta di un errore nel tentativo di apportare modifiche a s da questa richiamata" – giulio