EditText的子类的行为与EditText不同

时间:2013-04-16 14:57:43

标签: android android-edittext subclass

我写了一个EditText的子类。这是子类:

package com.package.foo;

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;

public class FuturaEditText extends EditText{

    public FuturaEditText(Context context) {
        this(context, null, 0);
    }

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

    public FuturaEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(!isInEditMode()) {
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/futura.ttf"));
        }
    }

}

但它的行为不像EditText,而是TextView。特别是,软键盘没有在焦点上升,并且没有EditText格式。为什么呢?

3 个答案:

答案 0 :(得分:4)

此实现,每个构造函数调用匹配的super构造函数:

package com.package.foo;

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;

public class FuturaEditText extends EditText{

    public FuturaEditText(Context context) {
        super(context);
        if(!isInEditMode()) {
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/futura.ttf"));
        }
    }

    public FuturaEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(!isInEditMode()) {
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/futura.ttf"));
        }
    }

    public FuturaEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(!isInEditMode()) {
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/futura.ttf"));
        }
    }

}

的工作原理。我只能假设EditText(context, attrs, 0)EditText(context, attrs)不同。

答案 1 :(得分:4)

为了完整性 - 来自消息来源:

public EditText(Context context, AttributeSet attrs) {
       this(context, attrs, com.android.internal.R.attr.editTextStyle);
}

因此,如果调用构造函数时没有默认样式,则默认为editTextStyle

答案 2 :(得分:3)

您不应该调用超级构造函数来完成缺少的参数,否则客户端无法调用少于3个参数的构造函数(即super.(Context context, AttributeSet attrs))。

第二个版本是正确的。