Как получить параметр EditText maxLength в коде - PullRequest
18 голосов
/ 09 ноября 2011

Я хотел бы видеть maxLength из EditText во время выполнения, чтобы иметь возможность принимать решение о выводе текста.
Это возможно?

Вот описание того, что яне хочу делать.

У меня есть ListView с множеством строк, и у каждой строки есть EditText и TextView.
Я создал подкласс ArrayAdapter, чтобы иметь возможность передавать строку, которую я хочупоместить в EditText каждой строки.
Я установил android:maxLength="12" в файле XML.
Я хочу отобразить число в этом поле EditText, но если число, которое я хочу отобразить, имеет более android:maxLength="12" Вместо этого я хочу отобразить «сообщение об ошибке».

И я бы предпочел не жестко кодировать, что 12 в моем подклассе ArrayAdapter.

Возможно, есть простое решение, но у меня нетпока не нашел.
(андроид первый раз ...)

Ответы [ 6 ]

36 голосов
/ 09 ноября 2011

Это должно работать:

editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(12) });
32 голосов
/ 09 ноября 2011

Получатели имеют только ограниченные параметры, поэтому я не думаю, что вы можете их прочитать.

Поэтому запишите длину (скажем, 12) в папку значений и используйте ее в макете xml и arrayAdapter.Теперь это не жестко запрограммировано.

1) Создать integer.xml в значениях *

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="integer" name="max_length">12</item>
</resources>

2) В макете

<TextView  android:id="@+id/tv"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:maxLength="@integer/max_length"
    />

3) в ArrayAdapter:

int maxLength = getResources().getInteger(R.integer.max_length);
9 голосов
/ 24 ноября 2015

Из API 21 вы можете сделать это следующим образом:

for (InputFilter filter : mEditText.getFilters()) {
        if (filter instanceof InputFilter.LengthFilter) {
            ((InputFilter.LengthFilter) filter).getMax());
        }
}

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 06 января 2015

расширить текст редактирования и извлечь значение из набора атрибутов в конструкторе.

открытый класс MyEditText расширяет EditText {

public static final String XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android";
private int mMaxLength;

public MyEditText(Context context) {
    super(context, null);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    mMaxLength = attrs.getAttributeIntValue(XML_NAMESPACE_ANDROID, "maxLength", -1);
}
2 голосов
/ 31 марта 2014

Вы можете получить значение поля , используя 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, который вы должны обрабатывать как неограниченная длина .

1 голос
/ 09 ноября 2011

Вроде сложно, но я не знаю другого подхода.Я надеюсь, что это работает (не проверено):

XmlResourceParser parser = getResources().getLayout(R.layout.theLayout);
String namespace = "http://schemas.android.com/apk/res/android";
int maxLength = parser.getAttributeIntValue(namespace, "maxLength", 12);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...