我写了一个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
格式。为什么呢?
答案 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)
)。
第二个版本是正确的。