基于EditText制作自定义视图的正确方法是什么?

时间:2016-12-20 09:49:34

标签: android android-edittext

扩展EditText的正确方法是什么?

问题在于:

我的模板有两个EditText的空应用程序:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="one"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="two"/>
</LinearLayout>

工作正常:

enter image description here

然后我从EditText创建自定义视图:

public class CuteEditText extends EditText {
    public CuteEditText(Context context) {
        this(context, null);
    }

    public CuteEditText(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CuteEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // some special initialization will be here
    }
}

当我将EditText更改为CuteEditText时,界面工作不正确:

enter image description here

问题不仅在于视图用户界面。如果我在第一个EditText中键入内容而不是触摸第二个,则会发生nohing:输入将首先继续。

如果我从AppCompatEditText继承CuteEditText,则会出现相同的行为。

有什么问题?

实验来源可在https://github.com/tseglevskiy/EditTextExperiment

获取

2 个答案:

答案 0 :(得分:0)

你的导师坏了。这应该是它的样子:

public class CuteEditText extends EditText {
    public CuteEditText(Context context) {
        super(context);
    }

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

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

答案 1 :(得分:0)

您不需要第三个构造函数重载。第一个用于以编程方式创建视图,第二个用于从xml创建视图。对于大多数情况,这两个应该足够了。

public class CuteEditText extends EditText {
    public CuteEditText(Context context) {
        this(context, null);
    }

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