Non c'è mai un punto qualsiasi esame dest
da solo in un InputFilter
; questo è ciò che è già presente nel campo. Modificare la corrispondenza dell'espressione regolare in modo che sia contro source
e sarebbe opportuno se si desidera solo verificare che alcuni caratteri siano stati accettati nel campo. Tuttavia, si desidera verificare la formattazione dei campi, non solo filtrare l'input sulla base di un carattere per carattere. Questo è molto più complesso.
Ogni volta che l'utente apporta una modifica al contenuto del tempEditText
, il sistema chiama filter
il metodo del filtro prima il cambiamento è in realtà composto. Passa il contenuto del campo corrente e la modifica proposta (che può essere inserita/aggiunta, eliminata o sostituita). Il cambiamento è rappresentato da una fonte CharSequence source
(i caratteri — se uno qualsiasi — da aggiungere al campo), gli indici di inizio e fine intervallo all'interno della sorgente (l'intervallo non è necessariamente tutto source
), uno Spanned dest
(il contenuto del campo corrente prima la modifica) e la gamma dstart e dend indexes all'interno di dest
che si propone di sostituire con la gamma indicata source
.
Il lavoro di filter
è quello di modificare il cambiamento (se necessario) e restituire un CharSequence
da utilizzare (nella sua interezza) al posto di source
(o null
di andare avanti e usare source
). Anziché controllare dest
come si sta facendo ora, sarà necessario verificare se la modifica risulterà in un campo accettabile. Per fare ciò, avrai bisogno di una logica più complessa. (Si noti, in particolare, che il nuovo carattere può essere inteso per inserimenti da qualche altra parte alla fine, inoltre, filter
verrà chiamato quando l'utente sta eliminando i caratteri e li aggiunge.)
Potrebbe essere più facile da implementare a TextWatcher
. Nel suo metodo beforeTextChanged
, è possibile registrare il contenuto corrente e nel suo metodo afterTextChanged
, è possibile controllare (utilizzando un'espressione regolare) se i contenuti sono accettabili e, in caso contrario, ripristinare i contenuti prima della modifica. (Assicurati, però, che il testo prima della modifica fosse accettabile.Se non lo è, sostituisci qualcosa di accettabile — come cancellare il campo, altrimenti il tuo codice andrà in un ciclo infinito perché il TextWatcher
verrà richiamato di nuovo quando tu correggere il contenuto del campo.)
Si ha anche un errore nell'espressione regolare: consente uno zero iniziale. Ecco una versione migliorata che risolve questo problema (e rimuove una serie di parentesi non necessarie):
"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"
(Per inciso:. È possibile utilizzare \\d
invece di [0-9]
)
EDIT
Ecco la mia modifica della tua modifica:
weightEditText.addTextChangedListener(new TextWatcher()
{
private static final Pattern sPattern
= Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$");
private CharSequence mText;
private boolean isValid(CharSequence s) {
return sPattern.matcher(s).matches();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after){
mText = isValid(s) ? new CharSequence(s) : "";
}
@Override
public void afterTextChanged(Editable s)
{
if (!isValid(s))
{
weightEditText.setText(mText);
}
mText = null;
}
});
Vedere http://stackoverflow.com/a/2811058/1160207 e http://stackoverflow.com/a/4174811/1160207. Ti aiuterà. –
Hai trovato la soluzione? – 5hssba