Я пытаюсь переопределить метод 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);
}
}
Я ожидаю, что не буду читать несколько «Должно быть напечатано после вызова ...» во время выполнения, на данный момент я должен ожидать, что не увижу ни одного его экземпляра, поскольку метод еще не был вызван.
Похоже, что работа, выполняемая в setContentView()
, вызывает getText()
, вероятно, для обработки правил компоновки. Это не так уж удивительно.
Спасибо вам обоим, я собираюсь создать собственный метод, который в конечном итоге вызовет исходный getText(), чтобы избежать этого. Я уже пробовал это, но хотел убедиться, прежде чем отказываться от идеи переопределить его.
EditText расширяется от класса TextView и класса TextView с вызовом метода getText() в его конструкторе. Это происходит всякий раз, когда вы создаете любой экземпляр пользовательского виджета, который является прямым/косвенным подклассом TextView, я думаю, это причина того, что вызывается getText() вашего пользовательского представления, даже если он нигде не вызывается в вашем коде проекта.
Если вы хотите выполнить некоторые проверки, а затем вызвать исходный метод getText(), чтобы получить от него значение, не переопределяйте метод в своем пользовательском классе. У вас есть обычный метод в вашем пользовательском классе, который имеет эти проверки, а затем вызывает исходный метод (для получения значения) на основе этих проверок, после чего вы можете вернуть значение из своего обычного метода.
Установите точку останова в начале вашего метода и запустите приложение в режиме отладки. Когда выполнение останавливается в точке останова, проверьте трассировку стека, чтобы узнать, кто вызывает ваш метод.