Fala galerinha, tudo sussa?
Essa semana um visitante do blog me perguntou o que eu usava para tratar máscara de CPF e CNPJ no Android, já que as opções de máscaras nativas do Android não atendem a essa necessidade dos desenvolvedores do Brasil, passei uma soluçãozinha que uso a muito tempo pra ele e lembrei que eu não tinha postado nada relacionado por aqui ainda, a minha solução se baseia na classe TextWatcher, esta classe está disponível desde a API 1, quando um objeto de TextWatcher é adicionado a um Editable, faz os métodos do TextWatcher serem chamados quando o texto do editable é mudado, então, basicamente o que eu faço é adicionar ou remover a máscara conforme o usuário altera o texto.
O código da classe, bem como um projeto de exemplo podem ser encontrados no meu GitHub, mas pra facilitar a vida de vocês eu também vou colocar ele abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; public class MaskUtil { private static final String CPFMask = "###.###.###-##"; private static final String CNPJMask = "##.###.###/####-##"; public static String unmask(String s) { return s.replaceAll("[^0-9]*", ""); } private static String getDefaultMask(String str) { String defaultMask = CPFMask; if (str.length() == 14){ defaultMask = CNPJMask; } return CPFMask; } public static TextWatcher insert(final EditText editText, final MaskType maskType) { return new TextWatcher() { boolean isUpdating; String oldValue = ""; public void onTextChanged(CharSequence s, int start, int before, int count) { String value = MaskUtil.unmask(s.toString()); String mask; switch (maskType) { case CPF: mask = CPFMask; break; case CNPJ: mask = CNPJMask; break; default: mask = getDefaultMask(value); break; } String maskAux = ""; if (isUpdating) { oldValue = value; isUpdating = false; return; } int i = 0; for (char m : mask.toCharArray()) { if ((m != '#' && value.length() > oldValue.length()) || (m != '#' && value.length() < oldValue.length() && value.length() != i)) { maskAux += m; continue; } try { maskAux += value.charAt(i); } catch (Exception e) { break; } i++; } isUpdating = true; editText.setText(maskAux); editText.setSelection(maskAux.length()); } public void beforeTextChanged(CharSequence s, int start, int count,int after) {} public void afterTextChanged(Editable s) {} }; } } |
Pra usar esta belezinha, uma vez que você já tenha o objeto do EditText simplesmente adicione o listener e o tipo de máscara e a classe faz o resto.
1 2 |
etCPF.addTextChangedListener(MaskUtil.insert(etCPF, MaskType.CPF)); etCNPJ.addTextChangedListener(MaskUtil.insert(etCNPJ, MaskType.CNPJ)); |
O Enum é bem simples.
1 2 3 4 |
public enum MaskType { CPF, CNPJ } |
Esta classe pode ser adaptada para qualquer máscara, bastando criar um novo formato na classe MaskUtil e alterar o método onTextChanged do TextWatcher, além de criar um novo valor no enum MaskType.
Molezinha né? qualquer dúvida comenta aí, que eu respondo o mais rápido possível, ou não.
Mascara de CPF e CNPJ no Android,