EditText的子类行为与EditText不同

3

我已经编写了一个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个回答

5

为了完整性 - 源代码如下:

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

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

这就解释了!谢谢 :) - Andrew Wyld

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) 不同。


没有原因的重复代码。当然,EditText(context, attrs, 0)不同于EditText(context, attrs)。正确的方法是在第一个构造函数中使用this(context, null),从而将其向上传递到构造函数链中。 - Simon
那个方法就是导致了我的问题。我没有调用 FuturaEditText(context);布局文件调用的是 FuturaEditText(context, attrs) 且没有命中正确的 super 构造函数。 - Andrew Wyld
好的,我从中学到了一些东西。请编辑您的帖子,以便我可以撤销我的-1。任何更改都可以。抱歉,我错了。 - Simon
这个解决方案是否也解决了您的软键盘未出现的问题? - Jannie Theunissen

3

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

第二个版本是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接