Как исправить переопределение метода getText EditText

Я пытаюсь переопределить метод getText() из EditText (который расширяет TextView). Мне нужно сделать некоторые проверки того, кто вызывает мой пользовательский метод, и если все проверки пройдены, тогда вызовите «оригинальный» EditText.getText().

Проблема заключается в том, что мой пользовательский метод вызывается несколько раз, пока мне не выдается ошибка OOM, обратите внимание, что мой пользовательский метод еще не вызывается из ниоткуда.

Это код: (вышеупомянутых проверок здесь нет, я только что вставил оригинальную реализацию EditText.getText в качестве замены, но проблема все еще присутствует)

public class CustomEdit extends EditText {


    public CustomEdit(Context context) {
        this(context, null);
    }

    public CustomEdit(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomEdit(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public Editable getText() {

        System.out.println("Should be printed once called...");

        CharSequence text = super.getText();

        if (text == null) {
            return null;
        }
        if (text instanceof Editable) {
            return (Editable) super.getText();
        }
        super.setText(text, BufferType.EDITABLE);
        return (Editable) super.getText();

    }

}

Это моя основная активность:

public class MainActivity extends AppCompatActivity {

    CustomEdit s;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        s = findViewById(R.id.newEditText);

    }
}

Я ожидаю, что не буду читать несколько «Должно быть напечатано после вызова ...» во время выполнения, на данный момент я должен ожидать, что не увижу ни одного его экземпляра, поскольку метод еще не был вызван.

Установите точку останова в начале вашего метода и запустите приложение в режиме отладки. Когда выполнение останавливается в точке останова, проверьте трассировку стека, чтобы узнать, кто вызывает ваш метод.

Ridcully 12.05.2019 16:00

Похоже, что работа, выполняемая в setContentView(), вызывает getText(), вероятно, для обработки правил компоновки. Это не так уж удивительно.

CommonsWare 12.05.2019 16:26

Спасибо вам обоим, я собираюсь создать собственный метод, который в конечном итоге вызовет исходный getText(), чтобы избежать этого. Я уже пробовал это, но хотел убедиться, прежде чем отказываться от идеи переопределить его.

tatoalo 13.05.2019 09:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

EditText расширяется от класса TextView и класса TextView с вызовом метода getText() в его конструкторе. Это происходит всякий раз, когда вы создаете любой экземпляр пользовательского виджета, который является прямым/косвенным подклассом TextView, я думаю, это причина того, что вызывается getText() вашего пользовательского представления, даже если он нигде не вызывается в вашем коде проекта.

Если вы хотите выполнить некоторые проверки, а затем вызвать исходный метод getText(), чтобы получить от него значение, не переопределяйте метод в своем пользовательском классе. У вас есть обычный метод в вашем пользовательском классе, который имеет эти проверки, а затем вызывает исходный метод (для получения значения) на основе этих проверок, после чего вы можете вернуть значение из своего обычного метода.

Другие вопросы по теме