2012-12-28 8 views
6

ho un EditText con TextWatcher. Dovrebbe formattare il testo a un'altezza umana di 5'9 ", ma quando l'utente commette un errore e desidera eliminare il carattere digitato il TextWather non gli consente di farlo. Diciamo che l'utente vuole eliminare" TextWather aggiunge subito la sua parte posteriore. Di seguito è riportato il codice. Quindi, come posso consentire all'utente di eliminare il testo in EditText?Come si elimina il testo in EditText con TextWatcher? Ogni volta che rileva una stringa e formatta la sua

private class CustomTextWatcher implements TextWatcher { 
    private EditText mEditText; 

public CustomTextWatcher(EditText e) { 
    mEditText = e; 
} 

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

public void onTextChanged(CharSequence s, int start, int before, 
     int count) { 


} 

public void afterTextChanged(Editable s) { 
    int count = s.length(); 
    String str = s.toString(); 
    if (count == 1) { 
     str = str + "'"; 
    } else if (count == 3) { 
     str = str + "\""; 
    } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
     str = str.substring(0, str.length() - 2) 
       + str.charAt(str.length() - 1) + "\""; 
    } else { 
     return; 
    } 
    mEditText.setText(str); 
    mEditText.setSelection(mEditText.getText().length()); 


} 

}

risposta

8

Ignorando il fatto Karakuri pubblicato sul codice essere nel richiamata sbagliata, si potrebbe aggiungere una semplice correzione dove basta ascoltare ciò che chiave utilizza l'utente.

Senza alcun test reale o ulteriori miglioramenti per il codice esistente, questo non sembra risolvere il problema descritto:

package com.example.testwatchertest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnKeyListener; 
import android.widget.EditText; 

public class MainActivity extends Activity implements TextWatcher { 

    EditText editText; 
    boolean keyDel = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editText = (EditText) findViewById(R.id.editText); 
     editText.addTextChangedListener(this); 

     editText.setOnKeyListener(new OnKeyListener() { 

      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (keyCode == KeyEvent.KEYCODE_DEL){ 
        keyDel = true; 
       }else{ 
        keyDel = false; 
       } 
       return false; 
      } 
     }); 

    } 

    @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) { 

     if (!keyDel) { 

      String str = s.toString(); 
      if (count == 1) { 
       str = str + "'"; 
      } else if (count == 3) { 
       str = str + "\""; 
      } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
       str = str.substring(0, str.length() - 2) + str.charAt(str.length() - 1) + "\""; 
      } else { 
       return; 
      } 
      editText.setText(str); 
      editText.setSelection(editText.getText().length()); 

     } 

    } 

} 
+0

Grazie Stefan. Ha risolto il problema. Ho spostato il codice sui metodi afterTextChanged() e ho usato boolean per controllare lo stato della chiave. Ha funzionato. Grazie ancora. –

+0

Per qualche motivo TextWatcher non funziona quando l'utente prova a digitare dopo aver corretto l'errore? Voglio dire quando digita un carattere e poi lo cancella e poi prova a digitare di nuovo TextWatcher non aggiunge i simboli "e" Come posso correggerlo? –

+1

OnKeyListener non funziona su Samsung Galaxy ma funziona bene su Motorola Xoom. –

2

From the docs:

public void astratto OnTextChanged (CharSequence s, int start, int prima, int count)

Questo metodo viene chiamato per notificare che, all'interno di s, i caratteri che iniziano all'inizio hanno appena sostituito il vecchio testo che aveva prima. Si tratta di un errore nel tentativo di apportare modifiche a s da a questa richiamata.

È necessario apportare modifiche in afterTextChanged(), non in nessuno degli altri due callback.

public void astratto afterTextChanged (s modificabile)

Questo metodo viene chiamato per notificare che, da qualche parte all'interno s, il testo è stato cambiato. È legittimo apportare ulteriori modifiche a s da questa callback , ma fare attenzione a non entrare in un ciclo infinito, poiché qualsiasi modifica apportata farà sì che questo metodo venga chiamato di nuovo in modo ricorsivo . (Non viene detto dove il cambiamento è avvenuto perché altri afterTextChanged() metodi possono già hanno fatto altri cambiamenti e invalidato gli offset. Ma se avete bisogno di sapere qui, è possibile utilizzare setSpan(Object, int, int, int) in onTextChanged(CharSequence, int, int, int) per segnare il tuo posto e poi guardare in alto da qui, dove la durata della finito.)

+0

ho spostato il codice al metodo afterTextChanged() e che non ha fatto alcuna differenza. Ho aggiornato il mio post. Grazie. –

Problemi correlati