Вы можете получить значение поля , используя Reflection API .
Почему вы не должны этого делать
Почти все будут выступать против этого (включая меня) потому что:
- Это медленно
- Это зависит от реализации
- Это не предназначено для доступа (очевидно)
На данный момент, глядя на исходный код (Android API 19), реализация зависит от InputFilter.LengthFilter
, который установлен в конструкторе как:
if (maxlength >= 0) {
setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });
} else {
setFilters(NO_FILTERS);
}
, где maxLength
целое число, которое вы хотите найти, проанализировано по атрибуту xml (android:maxLength="@integer/max_length"
).У этого InputFilter.LengthFilter
есть только одно поле (private int mMax
) и нет метода доступа.
Как это можно сделать
- Объявите статический метод в соответствующем служебном классепринимая
TextView
и возвращая int
. - Выполните итерацию по каждому
InputFilter
набору TextView
и найдите принадлежащий реализации InputFilter.LengthFilter
. - Доступ, получениеи вернуть значение поля mMax, используя Reflection.
Это даст вам что-то вроде этого:
import java.lang.reflect.Field;
// [...]
public static int getMaxLengthForTextView(TextView textView)
{
int maxLength = -1;
for (InputFilter filter : textView.getFilters()) {
if (filter instanceof InputFilter.LengthFilter) {
try {
Field maxLengthField = filter.getClass().getDeclaredField("mMax");
maxLengthField.setAccessible(true);
if (maxLengthField.isAccessible()) {
maxLength = maxLengthField.getInt(filter);
}
} catch (IllegalAccessException e) {
Log.w(filter.getClass().getName(), e);
} catch (IllegalArgumentException e) {
Log.w(filter.getClass().getName(), e);
} catch (NoSuchFieldException e) {
Log.w(filter.getClass().getName(), e);
} // if an Exception is thrown, Log it and return -1
}
}
return maxLength;
}
Как упоминалось ранее, это сломается, если реализация, которая устанавливает максимальную длинуиз TextView
изменений.Вы будете уведомлены об этом изменении, когда метод начнет бросать.Даже тогда, метод все еще возвращает -1, который вы должны обрабатывать как неограниченная длина .