2011-09-15 27 views
33

Hola, tengo EditText con el "texto = 0.00". cuando presiono el número 3 debería ser como 0.03 & segunda vez cuando presiono el número 5, el texto debería ser 0.35. Y 35.0, 35.09 así. El EditText que inicialmente tiene el valor como 0.00.¿Cómo usar el evento EditText onTextChanged cuando presiono el número?

Todo esto se hace con el mismo EditText.

¿Cómo lograr esto? Lo he intentado en addTextChangedListener() con TextWatcher().

+0

u puede dar ur solución? Necesito exactamente lo mismo – usman

Respuesta

30

Ha seleccionado el enfoque correcto. Tienes que extender la clase con TextWatcher y sobrescribir afterTextChanged(), beforeTextChanged(), onTextChanged().

Tiene que escribir la lógica deseada en el método afterTextChanged() para lograr la funcionalidad que necesita.

+1

cuando hago setText() se llama al afterTextChanged nuevamente, ¿cómo prevenir eso? – usman

74

También puede probar esto:

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

cuando lo hago setText() se llama nuevamente a onTextChanged, ¿cómo prevenir eso? – usman

+4

No se puede evitar que se llame a OnTextChanged en el evento setText. Tendrás que hacerlo tú mismo como si usaras algunos booleanos que se configuran en verdadero antes de configurar el texto y en ontextchanged, busca ese booleano y decide si continuar con el evento onTextChanged o no. Una solución más es eliminar TextChangeListener antes de configurar texto y configurarlo nuevamente después de configurar el texto. –

+0

Sí, no puedes evitar eso. Google recomienda utilizar el método [setSpan] (https://developer.android.com/reference/android/text/Spannable.html) si necesita saber dónde se realizaron los cambios –

5

Aquí, escribí algo similar a lo que u necesidad:

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 puso la lógica en "afterTextChanged" .. De la documentación sobre "onTextChanged" - "Es un error intentar hacer cambios a s desde esta devolución de llamada" – giulio

Cuestiones relacionadas