首页 > 解决方案 > 如何修复 EditText 的 getText 方法的覆盖

问题描述

我正在尝试从 EditText(扩展 TextView)中覆盖 getText() 方法。我需要检查谁在调用我的自定义方法,如果所有检查都通过了,则调用“原始”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);

    }
}

我不希望在运行时阅读多个“应在调用后打印...”,此时我应该希望看不到它的一个实例,因为尚未调用该方法。

标签: javaandroidandroid-edittext

解决方案


EditText 扩展自 TextView 类和 TextView 类,并在其构造函数中调用 getText() 方法。每当您创建作为 TextView 的直接/间接子类的自定义小部件的任何实例时都会发生这种情况,我想这就是原因,您的自定义视图的 getText() 被调用,即使它在您的项目代码中没有被调用。

如果要执行一些检查,然后调用原始 getText() 方法以从中获取值,则不要覆盖自定义类中的方法。在您的自定义类中有一个具有这些检查的普通方法,然后根据这些检查调用原始方法(以获取值),然后您可以从普通方法返回值。


推荐阅读