studio - salto de linea edittext android
La propiedad EditText maxLength no se aplica correctamente cuando se usa setFilters (4)
Cuando uso el método setFilter
en un EditText
para manejar caracteres especiales, la propiedad maxLength
no funciona como se esperaba. Mi código está abajo.
editName = (EditText)findViewById(R.id.rna_editTextName);
editName.setFilters(new InputFilter[]{getFilteredChars()});
//Below method returns filtered characters.
public InputFilter getFilteredChars()
{
InputFilter filter = new InputFilter()
{
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (end > start) {
char[] acceptedChars = new char[]{''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'', ''s'', ''t'', ''u'', ''v'', ''w'', ''x'', ''y'', ''z'',
''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''I'', ''J'', ''K'', ''L'', ''M'', ''N'', ''O'', ''P'', ''Q'', ''R'', ''S'', ''T'', ''U'', ''V'', ''W'', ''X'', ''Y'', ''Z'', '' '' ,''.'', ''/'''};
for (int index = start; index < end; index++) {
if (!new String(acceptedChars).contains(String.valueOf(source.charAt(index)))) {
return "";
}
}
}
return null;
}
};
return filter;
}
Esto se debe a que la propiedad maxLength
establece un InputFilter
en su EditText
. Al llamar a EditText.setFilters(new InputFilter[] {<YOUR_FILTER>})
está anulando todos los InputFilters existentes, incluido el utilizado por maxLength
.
Para solucionar esto, copie la matriz devuelta por EditText.getFilters()
y agregue la suya propia:
InputFilter[] editFilters = edit.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;
edit.setFilters(newFilters);
mientras establece la propiedad maxlenth de edittext programáticamente
por favor muéstrese use el código.
Wild Guess: el problema puede ser que establezca maxLength en el diseño. Al llamar a setFilters (), este comportamiento se reemplaza por el de su filtro.
Solución: utilice más de un filtro o implemente el comportamiento maxLenght en su filtro getFilteredChars ().
EDITAR: es posible que desee ver http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
y para su pregunta en el comentario, del doc:
when the buffer is going to replace the range dstart … dend of dest with the new text from the range start … end of source
Entonces, algo así como (Pseudo code liveCoding):
dest.lenght - (dend-dstart) + (end-start) = new legnth
Prueba este código Basado en @Jozua respuesta
/**
* Adds filter to EditText preserving other filters.
*
* @param editText
* @param filter
*/
public static void setFilter(EditText editText, InputFilter filter) {
InputFilter curFilters[] = editText.getFilters();
if (curFilters != null) {
InputFilter newFilters[] = new InputFilter[curFilters.length + 1];
System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length);
newFilters[curFilters.length] = filter;
editText.setFilters(newFilters);
} else {
editText.setFilters(new InputFilter[] { filter });
}
}
Puede agregar múltiples filtros en la matriz. Como el límite de caracteres máximo y el filtro de caracteres especiales en tu editText.
editText.setFilters (nuevo InputFilter [] {new InputFilter.LengthFilter (MAX_CHARACTER_LIMIT), SpecialCharacterInputFilter});